У ruby-модулей есть конструкторы? - PullRequest
3 голосов
/ 12 ноября 2011

То, что вызывается при расширении.

Например. этот кусок кода:

module M
  def init(x)
    @x = 5
    self
  end
  def foo
    super
    puts @x
  end
end
class D
  def foo
    puts 1
  end
end

D.new.extend(M).init(5).foo

работает и возвращает 1 5. Но я хочу изменить последнюю строку на

D.new.extend(M.init(5)).foo

или еще лучше

D.new.extend(M(5)).foo

, чтобы ошибки не устанавливались @ x.

На похожую заметку, могу ли я сказать что-то вроде

class X
  include Debug(5)

1 Ответ

1 голос
/ 12 ноября 2011

Вы можете сделать это с помощью метода, который возвращает модуль.

def M(par)
  m = Module.new
  m.module_eval %Q{
    def foo
      super
      puts #{par}
    end
  }
  m
end

D.new.extend(M(5)).foo # => 5

class X
  include M(4)
end

X.new.foo # => 4
...