Иногда мы «открываем уроки» без нашего ведома. Например, для некоторых глубоких модулей:
# space_gun.rb
class SpaceGun << Weapon
def fire
Trigger.fire
end
end
# space_gun/trigger.rb
class SpaceGun
class Trigger
end
end
Когда мы определяем триггер, мы открываем существующий класс SpaceGun. Это работает.
Однако, если мы загрузим два файла в обратном порядке, возникнет ошибка, потому что мы сначала определим класс SpaceGun, но не являемся оружием.
Иногда мы совершаем эту ошибку, потому что нам явно требуется субмодуль (например, триггер) от родительского класса. Это означает, что определение класса будет выполнено в обратном порядке, вызывая эту проблему.
# surely nothing can go wrong if we require what we need first right?
require 'space_gun/trigger'
class SpaceGun << Weapon
def fire
Trigger.fire
end
end
# BOOM
Или
- полагаться на автоматическую загрузку
- всегда помещает наследование в каждое вхождение открытого класса.