2015-10-20 43 views
0

C++社区最大的罪行之一是writing using namespace xyz instead of writing the namespace out everywhere in the code为什么Ruby不像C++那样具有相同的命名空间控制?

Ruby通过模块具有与命名空间相同的功能。所有关于在C++中使用完整名称空间的建议问题都适用于在Ruby中包含整个模块。但是在Ruby中,并不是要这样做。

那么,为什么Ruby没有与C++相同的命名空间控制?在Ruby中包含模块和在C++中使用namspace有什么区别?

+0

推测模块的内容是明确定义的,而C++名称空间的内容不是。但可能有一个强大的文化组成部分。也许在某些情况下,如果代码不能完成你认为正在做的事情,那么它并不重要。 – juanchopanza

+0

为什么近距离投票?这个问题听起来像一个意见?我不是在寻找意见。我想知道有什么不同。为什么Ruby不具有相同的问题? –

回答

3

有一种强烈的文化组成部分这一点,因为它是完全有效导入整个命名空间......

C++有参数依赖查找(ADL )和红宝石没有。随着程序的发展,一个无辜的using namespace x会越来越有可能意外地改变整个程序的含义,因为编译器碰巧找到了名称空间中x::命名空间中的一个更好的匹配,该函数具有相同的名称和类似的签名一个在(例如)y::命名空间中。

这是在这个问题上谨慎的原因。

2

当你混合时,你通常会“包含”一个模块 - 从一个模块到另一个模块的功能。混合插入和继承之间有一些相似之处,您可以将“模块/类”的功能“吸收”到当前模块/类中。这是a comparison of the two

但是,如果您不是混入功能,那么您总是会使用模块的适当名称空间限定符来访问其功能。

+0

因此,如果模块A包含模块B用于自己的目的,然后将模块A包含在我的程序中,那么模块B将不会包含在我的代码范围内?而在命名空间的C++中,它会是? –

+0

它将包含在范围内。你已经有效地将B混合到A中,所以它不会改变你从哪里访问它。但是如果你想访问模块A中的函数,你仍然可以使用完整的命名空间限定符:'A.foo()','A.bar()'等'include'只是将B合并/混合成A 。 –

0

您通常不会通过顶层包含所有内容(相当于在C++中使用名称空间)。你将它“混合”在你需要那个特定模块的功能的地方。

相关问题