我希望能够使用诸如writefln()
但不必添加import std.stdio
到文件顶部的功能.
解释它的另一种方法是你在C++中的方式.您可以键入std::cout << "Test";
,这将阻止您必须添加using namespace std;
.我想做同样的事情,但是在D.
我知道这是一个老问题,但我没有看到正确的答案,所以无论如何我都在回答.
静态进口
基本导入适用于模块和导入相对较少的程序.如果有大量导入,则可以在各种导入模块中的名称之间开始发生名称冲突.阻止这种情况的一种方法是使用静态导入.静态导入需要使用完全限定名称来引用模块的名称:
static import std.stdio; void main() { writefln("hello!"); // error, writefln is undefined std.stdio.writefln("hello!"); // ok, writefln is fully qualified }
资源
如上所述,D模块远不止C++命名空间.D也是MODULAR语言.D中的模块具有构造函数/析构函数.而且,D有包裹.在此处阅读有关D中模块和软件包的更多信息:http://www.digitalmars.com/d/2.0/module.html.
这是该页面所说的最有趣的部分:
模块与源文件一一对应.模块名称是文件名,其路径和扩展名被剥离.
模块自动为其内容提供命名空间范围.模块表面上类似于类,但不同之处在于:
每个模块只有一个实例,它是静态分配的.
没有虚拟表.
模块不继承,没有超级模块等.
每个文件只有一个模块.
可以导入模块符号.
模块始终在全局范围内编译,不受周围属性或其他修饰符的影响.
模块可以在称为包的层次结构中组合在一起.
模块提供了几种保证: - 导入模块的顺序不会影响语义. - 模块的语义不受导入它的影响. - 如果模块C导入模块A和B,对B的任何修改都不会以静默方式更改依赖于A的C中的代码.
您必须使用导入部分.但是,可以使用前面的完整模块路径来解决方法/功能/任何问题.例如,如果导入std.stdio(并使用Phobos),则std.stdio.writefln("...")将有效.如果您有多个名为"writefln"的函数,这将非常有用.