我试图找出模块的实例方法与模块的“常规”方法之间的真正区别。
为此,我启动了>> Kernel.instance_methods
>> Kernel.methods
并执行了以下操作:
Kernel.methods
我注意到这两者之间的输出是不同的。
例如,:readline
包含方法Kernel.instance_methods
而LICENSE = "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"
则不包括。
为什么以及如何发生这种情况?
感谢。
答案 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)。