例如:
module Example
class A
def initialize
puts "A"
end
end
class B
def initialize
::A.new
end
end
end
而不是:
module Example
class A
def initialize
puts "A"
end
end
class B
def initialize
Example::A.new
end
end
end
答案 0 :(得分:3)
B
可以像这样访问A
:
module Example
class A
def initialize
puts "A"
end
end
class B
def initialize
A.new
end
end
end
使用::A
告诉ruby在顶级范围内查找A
。
答案 1 :(得分:3)
在完全相同的级别上引用一个类真的不是一个很好的方法。但是,了解Ruby常量分辨率的工作方式在很多情况下都会涵盖你。
有两个范围门:关键字module
和class
。搜索从当前范围开始。如果在那里找不到常量,则搜索在树上继续前一个范围。等等,直到达到主要范围。
将::
放在常量前面引用主范围。
B#new
为例:
Example::A.new
在Example
范围内搜索B
。它在那里找不到它。它转到Example
的范围并使用Example
。
::A.new
从主范围开始,在那里搜索A
。它没有找到,因此失败。
::Example::A.new
从主范围开始,在那里搜索Example
。它找到它并在该范围内搜索A
。它找到它并使用A
A.new
从B
的范围开始。它在那里找不到它并向上移动到Example
的范围。它在那里找到A
并使用它。