Что я знаю о модулях: модули не могут быть созданы, не создают объекты и не поддерживают наследование. Сейчас я читаю Руководства по рельсам, чтобы полностью понять функцию автозагрузки Rails. И он вводит тему о константах Ruby, особенно о модулях и классах.
Определения классов и модулей могут быть вложенными для создания пространств имен:
module XML
class SAXParser
Module.nesting.inspect
end
end
=> "[XML::SAXParser, XML]"
Rails Guides заявляет, что вложение в любом заданном месте (например, Module.nesting, показанное выше) представляет собой набор внешних вложенных объектов класса и модуля. Я думаю, это означает, что он расширяется по мере продвижения наружу, поэтому внутренним будет C :: B :: A, затем следующим уровнем будет B :: A, а следующим уровнем будет A, при условии, что:
module A
module B
class C
end
end
end
Затем приводится другой случай:
class XML::SAXParser
Module.nesting.inspect
end
=> "[XML::SAXParser]"
Как видите, раскладка другая. В Rails Guide сказано: «XML ему не принадлежит». Что означает это заявление? К нему не относится? В модулях нет наследования. Может кто-нибудь лучше объяснить разницу между этими двумя случаями?
В Ruby вложенность - это конструкция синтаксический. Другими словами, это связано с тем, как код фактически записывается в сценарии. Разница во вложенности очевидна, если вы проигнорируете семантика, удалив имена, и просто посмотрите на синтаксис:
module ...
class ...
...
end
end
# as opposed to
class ...
...
end
Один - это класс внутри модуля, другой - просто класс. Семантически оба могут относиться к одному и тому же объектXML::SAXParser
, но для вложенности это не важно.
Это имеет значение в Ruby, потому что постоянный поиск выполняется с использованием вложенности, в отличие от поиска метода, который использует отношения семантических объектов.
A = "top level"
module XML
A = "module level"
class SAXParser
puts A # module level
def self.a
"defined in a class in a module"
end
end
end
class XML::SAXParser
puts A # top level
puts a # defined in a class in a module
end
Можете ли вы определить, что вы подразумеваете под «отношениями семантических объектов»?
Я имею в виду такие вещи, как наследование, включенные модули, одиночные классы. Все способы, которыми объекты связаны друг с другом по значению, а не только то, как они организованы в вашем исходном коде.
Вы можете посмотреть эта статья, хотя @Max дает хорошее объяснение.