Раздел «Язык Ruby».RubyCourseLecture07:
<<Метапрограммирование на Ruby

Следующая лекция
Предыдущая лекция

Лекция 7: Наследование. Примеси. Приоритеты вызовов методов

Рассмотрим объект a и метод foo:

a.foo

Какой именно метод foo вызывается в данном случае? Может быть несколько вариантов. Вот классические два варианта:

  1. метод, определенный для класса объекта a (a.class)
  2. метод, определенный для класса, от которого был унаследован класс a (a.class.super_class)

Если нет 1, то проверяется наличие 2. Если нет ни 1, ни 2, то кидается исключение NoMethodError.

Описанная выше ситуация сильно упрощена. В Ruby ситуация несколько сложнее:

  1. метод, определенный для singleton-класса объекта a (a.singleton_class)
  2. метод примеси, примешанной к singleton-классу объекта a (M: a.singleton_class.include?(M))
  3. метод, определенный для класса объекта a (a.class)
  4. метод примеси, примешанной к классу объекта a (M: a.class.include?(M))
  5. метод, определенный для класса, от которого был унаследован класс a (a.class.super_class)
  6. метод примеси, примешанной к классу, от которого был унаследован класс объекта a (M: a.class.super_class.include?(M))

Следующая лекция
Предыдущая лекция

-- ArtemVoroztsov - 10 Mar 2010