Здесь вы объединяете пару концепций, которые на самом деле не связаны, а именно путь загрузки, наследование и оператор разрешения области действия.
Когда требуется (или загружается) файл, аргумент ключевого слова require
просто берется как путь к файлу и добавляется к пути поиска загрузки (расширение .rb
необязательно для require
). Наследование и вложение здесь не вступают в игру, и любой файл может определять все, что он хочет, например ::
require 'foo' # Looks for "foo.rb" in each of $:
require 'foo/bar' # Looks for "foo/bar.rb" in each of $:
Вложенные классы (а также модули, переменные и т. Д.) Определяются, как ожидается, но разрешаются с помощью оператора разрешения области действия, например ::
.
class Foo
def foo; 'foo'; end
class Bar
def bar; 'bar'; end
end
end
Foo.new.foo # => "foo"
Foo::Bar.new.bar # => "bar"
Обратите внимание, что вложение и наследование классов не имеют отношения к расположению файла, из которого они загружаются. Кажется, нет никаких явных соглашений для структурирования классов / модулей, так что вы можете делать то, что работает для вас. Ruby Language страница книги по программированию Ruby также может быть полезна.