C ++社区中最大的攻击之一是writing using namespace xyz
instead of writing the namespace out everywhere in the code。
Ruby通过模块具有与命名空间相同的功能。在C ++中使用整个命名空间的所有提出的问题对于在Ruby中包含整个模块是完全有效的。但在Ruby中,并没有因此而受到谴责。
那么为什么Ruby没有与C ++相同的命名空间控制?在Ruby中包含模块和在C ++中使用namspace有什么区别?
答案 0 :(得分:3)
由于完全有效导入整个命名空间,因此有很强的文化成分...... 但是
c ++具有参数依赖查找( ADL ),而ruby则没有。随着程序的增长,无辜的using namespace x
会越来越有可能意外地改变整个程序的含义,因为编译器碰巧在x::
命名空间中找到了一个更好的匹配函数与(例如)y::
命名空间中的一个具有相同的名称和相似的签名。
这就是在这个问题上谨慎的原因。
答案 1 :(得分:2)
当您将功能从一个模块混合到另一个模块时,通常会“包含”模块。混合和继承之间存在一些相似之处,您可以将一个模块/类的功能“吸收”到当前模块/类中。这是a comparison of the two。
但是,如果您不是混合功能,那么您将始终使用模块的正确命名空间限定符来访问其功能。
答案 2 :(得分:0)
您通常不会通过顶层的包含(相当于在C ++中使用命名空间)来提取所有内容。你"混合"它需要来自该特定模块的功能。