Ключевые слова class , module и def - это так называемые "области видимости". Они создают новые возможности.
#!/usr/bin/env ruby
module ModuleA
class ClassA
def initialize
puts "test passed"
end
end
end
module ModuleB
include ModuleA
# test 1
c = ClassA.new # this works as ModuleA has been included into this module
class ClassB # class is a scope gate, creates new scope
def initialize # def is a scope gate, creates new scope
c = ModuleA::ClassA.new # must fully qualify ClassA
end
end
ClassB2 = Class.new do # no scope gate
define_method :initialize do # no scope gate
c = ClassA.new # this works, no need to fully qualify
end
end
end
b = ModuleB::ClassB.new
b2 = ModuleB::ClassB2.new
Я начал понимать области действия в Ruby после прочтения книги "Метапрограммирование Ruby" . Это действительно поучительно.
Редактировать : В ответ на комментарий ниже.
Класс - это, по сути, константа Ruby (обратите внимание, что это объект с заглавным именем). Константы имеют определенный алгоритм поиска в пределах области видимости. Язык программирования Ruby Книга О'Рейли хорошо объясняет это в разделе 7.9. Это также кратко описано в этом сообщении в блоге .
Константы верхнего уровня, определенные вне какого-либо класса или модуля, похожи на методы верхнего уровня: они неявно определены в Object. Когда на константу верхнего уровня ссылаются из класса, она разрешается во время поиска иерархии наследования. Если на константу ссылаются в определении модуля, она выполняет явную проверку объекта после поиска предков модуля.
Именно поэтому включение ModuleB на верхнем уровне делает класс в ModuleB видимым во всех модулях, классах и методах.