【问题标题】:Why doesn't Ruby have the same namespace controvery as C++?为什么 Ruby 没有与 C++ 相同的命名空间争议?
【发布时间】:2016-01-19 09:01:50
【问题描述】:

C++ 社区中最大的违规行为之一是writing using namespace xyz instead of writing the namespace out everywhere in the code

Ruby 通过模块具有与命名空间等效的功能。在 C++ 中使用整个命名空间的所有建议问题对于在 Ruby 中包含整个模块都是完全有效的。但在 Ruby 中,它并不注定要这样做。

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

【问题讨论】:

  • 可能模块的内容定义明确,而 C++ 命名空间的内容则不然。但可能有很强的文化成分。也许在某些情况下,如果代码没有做你认为它正在做的事情,这并不重要。
  • 为什么要关闭投票?这个问题听起来像一个意见吗?我不是在寻找意见。我想知道有什么区别。为什么 Ruby 没有同样的问题?

标签: c++ ruby


【解决方案1】:

这有很强的文化成分,因为导入整个命名空间是完全有效... 但是

c++ 有 Argument Dependent Lookup (ADL) 而 ruby​​ 没有。随着程序的增长,一个无辜的using namespace x 越来越有可能意外地改变整个程序的含义,因为编译器恰好在x:: 命名空间中为同名的函数找到了更好的匹配以及与(例如)y:: 命名空间中的一个类似的签名。

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

【讨论】:

    【解决方案2】:

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

    但是,如果您没有混合功能,那么您将始终使用模块的正确命名空间限定符来访问其功能。

    【讨论】:

    • 那么如果模块A出于自己的目的包含模块B,然后我在我的程序中包含模块A,那么模块B不会包含在我的代码范围内吗?而在带有命名空间的 C++ 中呢?
    • 它将包含在范围内。您已有效地将 B 混合到 A 中,因此它不会改变您从何处访问它。但是,如果您想访问模块 A 中的功能,您仍然可以使用完整的命名空间限定符:A.foo()A.bar() 等。include 只是将 B 合并/混合到 A 中。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2014-02-25
      • 2017-05-29
      • 1970-01-01
      • 2017-05-05
      • 2017-09-20
      • 1970-01-01
      相关资源
      最近更新 更多