рубин включить вопрос - PullRequest
       14

рубин включить вопрос

4 голосов
/ 29 октября 2009
class Foo
  def initialize(a)
    puts "Hello #{a}"
  end
end
module Bar
  def initialize(b)
    puts "#{b} World"
  end
end
class Sample < Foo
  include Bar
  def initialize(c)
    super
  end
end
Sample.new('qux') #=> qux World

Почему вывод не 'Hello qux'? кредит за код

Ответы [ 2 ]

10 голосов
/ 29 октября 2009

Когда вы включаете модуль в класс, он действует как тот, в который вы вставили новый суперкласс в иерархию классов, как раз между Sample и Foo. Вызов супер () поиска через включенные модули, прежде чем вернуться к реальному суперклассу (Foo).

2 голосов
/ 29 октября 2009

Короткий ответ: если бы это был "Hello World", это было бы абсолютно безумным разговором. Единственные два вывода, которые имеют какой-либо смысл, - это «Hello qux» или «Qux World». В данном случае «qux World» - это вывод, потому что это порядок:

  1. Sample расширяется Foo, initialize унаследовано от Foo
  2. Sample включает Bar, initialize переопределено
  3. Sample определяет initialize, который вызывает super, что указывает на реализацию самого последнего предка initialize, в данном случае Bar s

Надеемся, это должно прояснить ситуацию:

class Foo
  def initialize(a)
    puts "Hello #{a}"
  end
end
module Bar
  def initialize(b)
    super # this calls Foo's initialize with a parameter of 'qux'
    puts "#{b} World"
  end
end
class Sample < Foo
  include Bar
  def initialize(c)
    super # this calls Bar's initialize with a parameter of 'qux'
  end
end
Sample.new('qux')

Выход:

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