extend selfmodule_function是两种ruby方法,可以在模块上调用方法,如果包含该模块,也可以调用方法.

这些方法的最终结果有什么不同吗?

推荐答案

module_function将给定的实例方法设为私有,然后复制并将它们作为公共方法放入模块的元类中.extend self将所有实例方法添加到模块的单例中,保持其可见性不变.

module M
  extend self

  def a; end

  private
  def b; end
end

module N
  def c; end

  private
  def d; end

  module_function :c, :d
end

class O
  include M
  include N
end

M.a
M.b  # NoMethodError: private method `b' called for M:Module
N.c
N.d
O.new.a
O.new.b  # NoMethodError: private method `b' called for O
O.new.c  # NoMethodError: private method `c' called for O
O.new.d  # NoMethodError: private method `d' called for O

Ruby相关问答推荐

清理 jruby 中输入数据的编码错误

RSpec 是否有 python 类似功能来做 TDD?

Ruby 符号到类

Ruby 中有内置的二进制搜索吗?

在一组字符串中找到最长的公共起始子字符串

模块中的实例变量?

Ruby - net/http - 重定向

如何判断我是从 JRuby 还是 Ruby 运行?

如何在Ruby中返回两个字符串之间的字符串的子字符串?

如何通过一组新的给定键更改哈希的所有键

用零填充数字

Ruby 中的 $1 和 \1

用元素填充数组 N 次

用 Ruby 解析 XML

如何在 Ruby 脚本中运行 Rake 任务?

如何在 Ruby 中获取命名空间中的所有类名?

判断ruby中的字符长度

如何在没有 RVM 的 Ubuntu 上安装 Ruby 2

何时在 Ruby 中使用 Struct 而不是 Hash?

如何在 Rails 应用程序中使用 httparty 的基本身份验证?