Почему метод этого простого тестового класса не унаследован в Ruby? - PullRequest
1 голос
/ 29 мая 2010

Рассмотрим этот очень простой класс ведения журнала:

class MockLog
  # ...
end

Давайте добавим запись во все наши классы:

class Module
  def has_logging()
    class_eval {
      @log = MockLog.new
      def log
        self.class.instance_variable_get :@log
      end
    }
  end
end

Теперь, почему это не работает?

class Foo
  has_logging
end
Foo.new.log.nil?   # => false, as expected

class Bar < Foo
end
Bar.new.log.nil?   # => true?! Why wasn't the `log` method inherited?

1 Ответ

1 голос
/ 29 мая 2010

Метод log был унаследован (в противном случае вы получите NoMethodError), но ваша переменная экземпляра уровня класса не была, поэтому instance_variable_get вернул nil Вы должны объявить обычную переменную класса, такую ​​как:

class Module
  def has_logging()
    class_eval {
      @@log = MockLog.new
      def log
        @@log
      end
    }
  end
end

class Foo
  has_logging
end

class Bar < Foo
end

Теперь это будет наследоваться. См. Переменные класса и экземпляра в Ruby

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