Нет, стандартного способа принудительного вызова super
нет, чтобы выгуливать предков в определенном порядке.Они идут в заранее определенном порядке.Посмотрите на документацию по вызову методов :
Когда вы отправляете сообщение, Ruby ищет метод, который соответствует имени сообщения для получателя.Методы хранятся в классах и модулях, поэтому поиск по методам обходит их, а не сами объекты.
Вот порядок поиска методов для класса или модуля получателя R
:
- Предварительно добавленные модули
R
в обратном порядке - Для метода сопоставления в
R
- Включенные модули
R
в обратном порядке
ЕслиR
- это класс с суперклассом, это повторяется с суперклассом R
до тех пор, пока не будет найден метод.
Как только совпадение найдено, поиск метода останавливается.
Так как ваш класс Boy
включает в себя модуль Bipedal
напрямую, и поскольку во включенных модулях поиск выполняется до суперкласса, и поскольку поиск останавливается, как только найдено совпадение, суперкласс Person
никогда не проверяется.
То же самое верно при использовании уточнений , потому что поиск всегда поражает включенные модули перед проверкой суперкласса.
Если вы переместите include Bipedal
в класс Person
, тогда он будет работать так, как уВы ожидаете, потому что Boy
не включает модуль напрямую, поэтому он в конечном итоге будет искать суперкласс, где он найдет определенный метод.
Могут быть и другие творческие способы достижения этой цели, например Boy.superclass...
пример, который вы привели, но вы спросили, возможно ли изменить поведение поиска при вызове super
, а ответ - нет, согласно документации.