“Расширяются сам” то же как “module_function”?

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

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

41
задан Adrian 1 March 2010 в 01:58
поделиться

1 ответ

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
57
ответ дан 27 November 2019 в 00:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: