似乎没有简单的方法可以防止D的import语句蒙上全局命名空间:
module x;
import std.stdio;
void main() {
writeln("Hello!");
}
Run Code Online (Sandbox Code Playgroud)
一旦你import std.stdio
,writeln
现在是全球性的.来自[language with namespaces]
,如果我只能参考,那将是很好的std.stdio.writeln
,特别是在一两个星期内,我可以轻松地告诉我们提供什么writeln
.
用类和结构读取命名空间后?在我看来,这应该做我想做的事情(尽管不像现在这样):
module x;
import std.stdio;
class String {
struct write {
auto println = writeln;
}
}
void main() {
String string = new String();
string.write.println("Hello!");
}
Run Code Online (Sandbox Code Playgroud)
但我知道Error: variable [...] type void is inferred from initialiser [...], and variables cannot be of type void
,这意味着功能混叠已经消失.
如果我写C,我可以理解缺少命名空间(但我仍然可以用结构和点符号来实现它们).有没有办法让导入的名称不那么全球化?
我倾向于同意@weltensturm - D优雅地处理冲突,人工创建命名空间只会让事情变得混乱.
D(恕我直言)的一个不错的部分是避免你在其他语言中看到的那些长名,而不用担心会发生什么可怕的事情.
但是,如果您真的需要,请查看模块上的文档 ,其中显示了如何重命名模块:
import io = std.stdio;
void main()
{
io.writeln("hello!"); // ok, calls std.stdio.writeln
std.stdio.writeln("hello!"); // error, std is undefined
writeln("hello!"); // error, writeln is undefined
}
Run Code Online (Sandbox Code Playgroud)
您还可以使用静态导入,因此您必须使用完全限定名称:
static import std.stdio;
void main()
{
std.stdio.writeln("hello!"); // OK
writeln("hello!"); // error, writeln is undefined
}
Run Code Online (Sandbox Code Playgroud)
这很简单 - 如果你不喜欢命名空间污染,那么你必须做静态导入.
以下是D规范所说的内容(http://dlang.org/spec/module.html,"静态导入"部分):
基本导入适用于模块和导入相对较少的程序.如果有大量导入,则可以在各种导入模块中的名称之间开始发生名称冲突.阻止这种情况的一种方法是使用静态导入.静态导入需要使用完全限定名称来引用模块的名称:
例:
static import std.stdio;
void main() {
writeln("hello!"); // error, writeln is undefined
std.stdio.writeln("hello!"); // ok, writeln is fully qualified
}
Run Code Online (Sandbox Code Playgroud)
如果我的代码只需要模块中的一个或两个符号,我就会使用Max Alibaev提到的选择性导入.说我会使用writeln()很多.- 然后我很可能import std.stdio : writeln;
在我的D代码中有一行.