我有点假设
module A
module B
end
end
和
module A::B
end
是相似的。 我能够从this blog,this SO thread和and this SO thread找到解决方案。
为什么以及什么时候应该更喜欢紧凑语法A::B
而不是另一个,因为它明显有缺点?我有一种直觉,它可能与性能有关,因为在更多名称空间中查找常量需要更多的计算。但我无法通过对普通类进行基准测试来验证这一点。
答案 0 :(得分:7)
这两种写作方法经常混淆。
首先要说的是,据我所知,没有可测量的性能差异。 (以下书面例子中的一个常量查找)
最明显的差异,可能是最知名的,是您的第二个示例(module A::B
)要求,module A
在定义时存在。< / p>
除此之外,大多数人认为它们是可以互换的。那是不正确。
模块只是ruby中的常量,因此适用常规常量查找。
让我以一个例子来说明:
module A
class Test
end
module B
class Show
p Module.nesting # =>[A::B::Show, A::B, A]
def show_action
Test.respond_with(%q(I'm here!))
end
end
end
end
另一方面,如果你通过A::B
调用它,看看会发生什么:
module A
class Test
end
end
module A::B
class Show
p Module.nesting # => [A::B::Show, A::B]
def show_action
Test.respond_with(%q(I'm here!))
end
end
end
区别在于.nesting
产生:
1)在第一种情况下:[A::B::Show, A::B, A]
(你嵌套在module A
)
2)在第二种情况下:[A::B::Show, A::B]
(此处不是)
答案 1 :(得分:1)
第一个信息比第二个信息更多。当然,在大多数情况下,您可以假设第二种形式总是可以被第一种形式取代,而不是相反。实际上,除非事先定义A
,否则不能使用第二种形式。但请注意,Module#nesting
的返回值在两种形式之间有所不同,因为该方法具有词法范围解释。