В большинстве ответов рекомендуется ставить оператор require в верхней части файла. Однако, когда требуются вложенные классы / модули, вы можете вместо этого включить их в класс (вверху). Посмотрите на этот пример:
# foo.rb
require './foo/bar'
class Foo < Struct.new(:name, :description)
def bar
Bar.new(self)
end
end
# foo/bar.rb
class Foo
class Bar < Struct.new(:foo)
end
end
IRB:
require './foo'
# ...
# TypeError (superclass mismatch for class Foo)
Это происходит потому, что Bar вложен в Foo , и его необходимо определить как таковое, вложив класс Bar в Foo учебный класс. Однако, поскольку Foo еще не определен, он теперь определяется вложенной структурой. После успешного заполнения Bar мы теперь пытаемся определить класс Foo , который наследуется от другого класса. Это терпит неудачу из-за того, что Foo уже определено (вложенной структурой), и наследование может происходить только при начальном определении класса. Таким образом, подняв:
TypeError (несоответствие суперкласса для класса Foo)
Эту проблему можно решить, просто переместив оператор require в класс Foo .