Является ли «расширение себя» таким же, как «модуль_функция»? - PullRequest
40 голосов
/ 01 марта 2010

extend self и module_function - два рубиновых способа сделать это, чтобы вы могли вызывать метод в модуле, а также вызывать его, если вы включаете этот модуль.

Есть ли различия между конечными результатами этих способов?

1 Ответ

55 голосов
/ 01 марта 2010

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...