正如我所理解的ruby类,它们几乎与模块相同,除了具有能够实例化它的附加功能。由于Class
继承自Module
,我假设每个类(类Class
的对象)都可以访问module_function
,但似乎并非如此。当我对模块和类'private_instance_methods有所不同时,我发现Module
有3种方法而不是Class
- [:append_features, :extend_object, :module_function]
如何从Class对象的调用链中删除这些函数,更重要的是为什么?
答案 0 :(得分:3)
这些核心功能是用C实现的,所以讨论它并不具有普遍性,并且没有用处。在Ruby中,您可以使用undef
取消定义继承的方法,而无需在超类中取消定义方法。
class Foo
def foo; end
end
class Bar < Foo
undef :foo
end
Foo.new.foo
# => nil
Bar.new.foo
# => NoMethodError: undefined method `foo' for #<Bar:0x007f85c3ce3330>
append_features
是一个在模块include
- d之前调用的钩子,模块可以是一个,但不是一个类。extend_object
是一个在模块extend
编辑之前调用的钩子,模块可以是,但不是类。module_function
的目的是将方法加倍作为类方法和私有实例方法,后者在包含该模块时很有用,可以使用模块但不能使用类来完成。