在ruby中,我开始看到一个非常正常的做法,包括引用为:: ModuleName :: ClassName的模块和mixins,在过去它几乎只是ModuleName :: ClassName。
我想在这里得到一个体面的理解,为什么最近会看到这种做法,以及它的不同之处。
有什么区别?
有什么好处(如果先前没有回答这个问题)?
提前感谢您的意见。
答案 0 :(得分:9)
如果您将::
放在开头,那么您指的是全局命名空间,如果不是,则指的是您当前的命名空间。
通常,如果您的类/模块中没有同名的类/模块,则不需要在开头使用::
。
class Customer
def to_s
"Customer global"
end
end
class Order
class Customer
def to_s
"Customer within order"
end
end
def initialize
puts Customer.new
puts ::Customer.new
end
end
Order.new
将打印出来
Customer within order
Customer global
答案 1 :(得分:3)
当您执行::ModuleName::ClassName
时,您说:
我希望您在根命名空间中查找
的类::ModuleName::ClassName
,忽略此代码是否在另一个模块中找到。因此,它总是会寻找一个名为::ModuleName::ClassName
而没有其他
当你这样说ModuleName::ClassName
时,你会说:
我希望您先查看
ModuleName::ClassName
,但先查看当前范围,然后查看其他范围。所以,如果你有一个名为MyModule的模块,而我的模块引用了ModuleName::ClassName
,那么首先尝试找到MyModule::ModuleName::ClassName
,然后尝试解析::ModuleName::ClassName
。
当我定义这样的代码时,我几乎总是使用:: ModuleName :: ClassName来避免任何命名冲突。