"extend self"和"module_function"一样吗?

Adr*_*ian 41 ruby module

extend self并且module_function是两种红宝石方法,因此您可以在模块上调用方法,如果包含该模块也可以调用它.

这些方式的最终结果之间是否存在差异?

rub*_*iii 57

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
Run Code Online (Sandbox Code Playgroud)

  • 是的module_function类方法是公共的,但实例方法是私有的 (3认同)