<<Метапрограммирование на Ruby
Лекция 7: Наследование. Примеси. Приоритеты вызовов методов
Рассмотрим объект a и метод foo:
Какой именно метод foo вызывается в данном случае? Может быть несколько вариантов. Вот классические два варианта:
- метод, определенный для класса объекта a (a.class)
- метод, определенный для класса, от которого был унаследован класс a (a.class.super_class)
Если нет 1, то проверяется наличие 2. Если нет ни 1, ни 2, то кидается исключение NoMethodError.
Описанная выше ситуация сильно упрощена. В Ruby ситуация несколько сложнее:
- метод, определенный для singleton-класса объекта a (a.singleton_class)
- метод примеси, примешанной к singleton-классу объекта a (M: a.singleton_class.include?(M))
- метод, определенный для класса объекта a (a.class)
- метод примеси, примешанной к классу объекта a (M: a.class.include?(M))
- метод, определенный для класса, от которого был унаследован класс a (a.class.super_class)
- метод примеси, примешанной к классу, от которого был унаследован класс объекта a (M: a.class.super_class.include?(M))
--
ArtemVoroztsov - 10 Mar 2010