40


17

「自己拡張」は「module_function」と同じですか?

extend self`と module_function`は、モジュールのメソッドを呼び出したり、そのモジュールをインクルードした場合に呼び出したりできるようにする2つのルビーの方法です。

これらの方法の最終結果に違いはありますか?

1 Answer


55


`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