我可以避免使用D导入污染公共命名空间吗?

cat*_*cat 2 namespaces d

似乎没有简单的方法可以防止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,我可以理解缺少命名空间(但我仍然可以用结构和点符号来实现它们).有没有办法让导入的名称不那么全球化?

rco*_*rre 7

我倾向于同意@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)

  • 记得`静态导入'是一件事.这可能就是你要找的东西. (2认同)

Dej*_*kic 5

这很简单 - 如果你不喜欢命名空间污染,那么你必须做静态导入.

以下是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代码中有一行.