странное наследство в рубиновых миксинах - PullRequest
2 голосов
/ 24 июля 2010

Мне интересно, почему методы включенного модуля смешиваются с любыми последующими определениями классов (как если бы класс включал их в себя)?* Это ожидаемое поведение?Почему?

Ответы [ 2 ]

2 голосов
/ 24 июля 2010

и include на верхнем уровне смешивают модуль в Object. Поскольку он смешан с Object, он доступен как метод экземпляра для всего.

2 голосов
/ 24 июля 2010

Когда вы включаете Foo в вашу программу, но вне какого-либо класса или метода, он включается в текущую область видимости, которая является объектом main.

Вы можете проверить это, изменив метод bar наследующее

  def bar
    print "InBar class: #{self.class} value: #{self}\n"
  end

и затем добавление следующих 2 строк в конце

2.bar
Fixnum.bar

Это даст вам следующий вывод

There is no Bar.bar
InBar class: Object value: main
InBar class: Class value: Bar
InBar class: Bar value: #<Bar:0x21ecec>
InBar class: Fixnum value: 2
InBar class: Class value: Fixnum
...