Ruby类的module_function

时间:2014-02-13 21:40:28

标签: ruby

正如我所理解的ruby类,它们几乎与模块相同,除了具有能够实例化它的附加功能。由于Class继承自Module,我假设每个类(类Class的对象)都可以访问module_function,但似乎并非如此。当我对模块和类'private_instance_methods有所不同时,我发现Module有3种方法而不是Class - [:append_features, :extend_object, :module_function]

如何从Class对象的调用链中删除这些函数,更重要的是为什么?

1 个答案:

答案 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的目的是将方法加倍作为类方法和私有实例方法,后者在包含该模块时很有用,可以使用模块但不能使用类来完成。