我没有采用通常的CS路线来学习编程,我经常听到名称空间,但我并不理解这个概念。我在网上找到的描述通常是在我不熟悉的C语境中。
我一直在做Ruby 2年,我正在努力深入了解语言和OOP。
答案 0 :(得分:45)
我将提供一个更普通的描述。
说我的妻子有一个名叫苏的妹妹,我也一样。我怎么能在谈话中把他们分开?使用他们的姓氏(“Sue Larson”vs“Sue Jones”)。 姓氏是命名空间。
这当然是一个有限的例子,在编程中,潜在的家庭成员可能比我的例子多得多,因此碰撞的可能性更高。命名空间在某些语言中也是分层的(例如java),它与姓氏并不相同。
但除此之外它是一个类似的概念。
答案 1 :(得分:16)
来自维基百科的namespace的定义:
命名空间是一个抽象容器或环境,用于保存唯一标识符(即名称)的逻辑分组。 ...
例如,您可以找到一个可以使用名称空间的地方是这样的:
定义常量或变量,甚至是具有通用名称的类。如果您不希望重命名此常量/变量/类,但需要另一个具有相同名称的那个,则可以在不同的名称空间中定义该新实例。
在ruby中,模块与C ++中的命名空间基本相同。
例如:
module Foo
BAZ = 1
end
module Bar
BAZ = 2
end
puts Foo::BAZ #=> 1
puts Bar::BAZ #=> 2
所以,在那里,你在两个模块中声明了常量BAZ
(在ruby中也称为名称空间)
答案 2 :(得分:14)
命名空间提供了一个容器,用于保存函数,类和常量之类的东西,以便将它们逻辑地组合在一起,并帮助避免与其他人编写的具有相同名称的函数和类冲突。
在Ruby中,这是使用模块实现的。
答案 3 :(得分:3)
将其视为对象和功能的逻辑分组
答案 4 :(得分:2)
Wikipedia有一篇关于名称空间的简短但有用的文章,以及计算机科学中名称空间更为详细的one,其中包含特定于语言的示例& c。
关键是,当你无法将名称“逻辑分组”到命名空间中时,即你只有一个无差别的“空格”所有名称都存在,为了避免意外冲突你最终笨拙地重新实现基本名称空间功能名称前缀和c等技巧。例如,“画画”意味着与艺术家或枪手截然不同的东西;如果你不能为artist-stuff和gunslinger-stuff提供单独的命名空间,你最终会得到artist_draw
和gunslinger_draw
之类的标识符,而仍会冒险意外冲突如果某些图书馆作者使用不同的约定等等。
答案 5 :(得分:2)
来自php.net:
什么是命名空间?在最广泛的 定义命名空间是一种方式 封装项目。这可以看出来 作为许多地方的抽象概念。 例如,在任何操作系统中 目录用于分组相关 文件,并作为的命名空间 其中的文件。作为一个具体的 例如,文件foo.txt可以存在于 目录/ home / greg和in / home / other,但是foo.txt的两个副本 不能在同一目录中共存。 另外,要访问foo.txt / home / greg之外的文件 目录,我们必须前置 使用目录名到文件名 要获取的目录分隔符 /home/greg/foo.txt。这都儿一样 原则扩展到了名称空间 编程世界。
因此,正如另一张海报所提到的,命名空间可用于将项目组合在一起。
要了解为什么这可能有用,假设您想为Wordpress编写一个插件,并且您想要创建一个名为“MyClass”的类。但问题是,您不知道其他开发人员是否已经使用名为“MyClass”的类编写了另一个Wordpress插件。因此,为避免命名冲突,请将类命名为“MyPluginMyClass”。这很烦人,但它可能避免了命名冲突。
然后是PHP 5.3的发布,它最终支持名称空间(我们也假设,Wordpress和部署它的所有服务器都升级到PHP 5.3)。现在你可以创建一个命名空间,比如'MyPlugin',并在其中封装'MyClass'。完成此操作后,您可以发布您的插件,而不必担心您的“MyClass”版本会与其他人的“MyClass”版本冲突。
答案 6 :(得分:2)
最短答案:命名空间创建范围。