据我了解 ruby 类,它们几乎与模块相同,除了能够实例化它的附加功能。由于 Class
继承自 Module
,我假设每个类(Class
类的对象)都可以访问 module_function
>,但似乎并非如此。当我对 Module 和 Class 的 private_instance_methods 进行差异时,我发现 Module
比 Class
多了 3 个方法 - [:append_features, :extend_object, :module_function]
这些函数是如何从 Class 对象的调用链中删除的,更重要的是为什么?
最佳答案
这些核心功能都是用C实现的,因此讨论它不具有通用性,也没有什么用处。在 Ruby 中,您可以使用 undef
取消定义继承的方法,而无需取消定义父类(super class)中的方法。
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 之前调用的钩子(Hook),可以是模块,但不能是类。extend_object
是在模块被extend
编辑之前调用的钩子(Hook),可以是模块,但不能是类。module_function
的目的是将方法加倍为类方法和私有(private)实例方法,当您包含该模块时,后者很有用,可以使用模块来完成,但不能使用一个类。
关于ruby - Ruby 类的 module_function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21766081/