"Self.included?" в рубине - PullRequest
       1

"Self.included?" в рубине

3 голосов
/ 29 апреля 2011

В следующем коде

module Test
  @connection = nil
  def self.included?(base)
    @connection = base
  end

  def print
    puts @connection
  end
end

class ModuleTest
  include Test
end

m = ModuleTest.new
m.print

почему @connection ноль при печати?

Ответы [ 2 ]

4 голосов
/ 29 апреля 2011

Почти верно, с парой твиков работает:

module Test
  def self.included(base)
    @@connection = base
  end

  def print
    puts @@connection
  end
end

class ModuleTest
  include Test
end

ModuleTest.new.print

Проблемы:

  1. обратный вызов включен без ?.
  2. в методах класса имеет смысл использовать переменные класса, чем переменные экземпляра
4 голосов
/ 29 апреля 2011

Когда вы запускаете print, он печатает переменную экземпляра @connection экземпляра ModuleTest. У вас есть два других места в вашем коде, ссылающиеся на @connection, но они указывают на переменную экземпляра @connection экземпляра ModuleTest класса Class, и это совсем другое.

Более того, даже последний @connection (тот, что для ModuleTest класса) не получает его значение base, пока вы не сделаете included?.

Переменная экземпляра для созданного экземпляра ModuleTest, таким образом, по умолчанию инициализируется на nil при вызове puts в print.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...