ruby - Ruby 类的 module_function

标签 ruby

据我了解 ruby​​ 类,它们几乎与模块相同,除了能够实例化它的附加功能。由于 Class 继承自 Module,我假设每个类(Class 类的对象)都可以访问 module_function >,但似乎并非如此。当我对 Module 和 Class 的 private_instance_methods 进行差异时,我发现 ModuleClass 多了 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/

相关文章:

ruby - 有条件地设置 CSS 类

ruby-on-rails - 在 Ruby on Rails 中使用 bundle exec

ruby - 将一组值分配给 Hash.values 的最佳方法是什么

ruby gsub 问题

mysql - gem mysql2 gem 未加载

html - 从 capybara 的数据值属性中获取值

ruby - 获取 Cucumber 步骤定义中引号内的所有项目

ruby - 如何在 Ruby 中创建无类 DSL?

arrays - 如何检查数组中的每个元素是否都大于它之前的元素?

javascript - 我如何在 Opal-rails 中打印在 Javascript 中定义的变量