Ruby中的模块实例方法和模块“常规”方法

时间:2017-03-30 06:13:30

标签: ruby

我试图找出模块的实例方法模块的“常规”方法之间的真正区别。

为此,我启动了>> Kernel.instance_methods >> Kernel.methods 并执行了以下操作:

Kernel.methods

我注意到这两者之间的输出是不同的。

例如,:readline包含方法Kernel.instance_methodsLICENSE = "MIT" do_install () { install -d ${D}/${bindir} touch ${D}/${bindir}/foobar } pkg_postinst_${PN} () { setcap cap_chown+e "$D/${bindir}/foobar" } # Dependency when installing on the target. RDEPENDS_${PN} = "libcap" # Dependency for rootfs construction, Yocto > 2.3. PACKAGE_WRITE_DEPS = "libcap-native" # Dependency for rootfs construction, Yocto <= 2.3 (untested). # Enabling this makes builds slightly less efficient with # Yocto > 2.3 because it implies that libcap-native is # needed for building this recipe, which isn't the case. # DEPENDS += "libcap-native" 则不包括。

为什么以及如何发生这种情况?

感谢。

2 个答案:

答案 0 :(得分:3)

这可能会澄清一些事情:

▶ module Test
▷   def im; end
▷   def mm; end
▷   module_function :mm
▷ end  
▶ Test.methods(false) # false to not output inherited
#⇒ [
#    [0] mm() Test
# ]
▶ Test.instance_methods(false) # false to not output inherited
#⇒ [
#    [0] :im
# ]
▶ Test.im
#⇒ NoMethodError: undefined method `im' for Test:Module
#     from (pry):99:in `__pry__'
▶ Test.mm
#⇒ nil # fine, called

模块方法可以按原样调用,如上所示。例如,方法需要一个实例:

▶ "Hello world!".extend(Test).im
#⇒ nil # fine, called

答案 1 :(得分:0)

你可以参考Ruby帮助文件(https://ruby-doc.org/core-2.2.3/Kernel.html),有关于模块内核的文字:

  

&#34;内核模块包含在Object类中,因此它的方法是   可用于每个Ruby对象。&#34;

Kernel.methods包含所有Kernel.instance_methods方法,您可以尝试使用此代码进行验证:

p Kernel.instance_methods&Kernel.methods == Kernel.instance_methods

在我看来,Kernel.instance_methods可以被你创建的任何对象调用,但是某些Kernel.methods不能被对象调用(比如Array / String / Hash)。