基本导入工作原理:首先,在当前名字空间里搜索名字。如果没有找到,那么就到所有导入的模块里去找。如果在这些导入模块中唯一找到一个,则使用它。如果在多个导入模块里都找到,则报错。
默认情况下,导入是private的。即如果 A 导入模块 B,同时 B 又导入模块 C,则 C 的名字是不会被搜索的。一个导入可以特别地声明为public的,即如果在B中导入C的语句形如:public import C;,则在A中就可以看到C中的符号。
// 静态导入
static import std.stdio;
int main(string[] argv)
{
//writefln("hello!"); // 错误,writefln 未定义
std.stdio.writefln("hello!"); // 正确,writefln 被完全限定
return 0;
}
// 更名导入。在处理很长的导入名时较方便
import io = std.stdio;
int main(string[] argv)
{
io.writefln("hello!"); // 正确,调用 std.stdio.writefln
//std.stdio.writefln("hello!"); // 错误,std 未定义
//writefln("hello!"); // 错误,writefln 未定义
return 0;
}
// 选择性导入,只导入一个包中的若干符号。注意:static不能跟选择性导入一起使用
import std.stdio : writefln, foo = writef;
void main()
{
//std.stdio.writefln("hello!"); // 错误,std 未定义
writefln("hello!"); // 正确,writefln 被绑定到当前名字空间
//writef("world"); // 错误,writef 未定义
foo("world"); // 正确,调用 std.stdio.writef()
//fwritefln(stdout, "abc"); // 错误,fwritefln 未定义
}
// 更名的且带选择性的导入
import io = std.stdio : foo = writefln;
void main()
{
//writefln("bar"); // 错误,writefln 未定义
//std.stdio.foo("bar"); // 错误,std 未定义
//std.stdio.writefln("bar"); // 错误,std 未定义
foo("bar"); // 正确,foo 被绑定到当前名字空间
io.writefln("bar"); // 正确,io=std.stdio 将在当前名字空间里的名称 io绑定来引用整个模块
//io.foo("bar"); // 错误,foo 被绑定到当前名字空间, foo 不是 io 的成员
}
默认情况下,导入是private的。即如果 A 导入模块 B,同时 B 又导入模块 C,则 C 的名字是不会被搜索的。一个导入可以特别地声明为public的,即如果在B中导入C的语句形如:public import C;,则在A中就可以看到C中的符号。
// 静态导入
static import std.stdio;
int main(string[] argv)
{
//writefln("hello!"); // 错误,writefln 未定义
std.stdio.writefln("hello!"); // 正确,writefln 被完全限定
return 0;
}
// 更名导入。在处理很长的导入名时较方便
import io = std.stdio;
int main(string[] argv)
{
io.writefln("hello!"); // 正确,调用 std.stdio.writefln
//std.stdio.writefln("hello!"); // 错误,std 未定义
//writefln("hello!"); // 错误,writefln 未定义
return 0;
}
// 选择性导入,只导入一个包中的若干符号。注意:static不能跟选择性导入一起使用
import std.stdio : writefln, foo = writef;
void main()
{
//std.stdio.writefln("hello!"); // 错误,std 未定义
writefln("hello!"); // 正确,writefln 被绑定到当前名字空间
//writef("world"); // 错误,writef 未定义
foo("world"); // 正确,调用 std.stdio.writef()
//fwritefln(stdout, "abc"); // 错误,fwritefln 未定义
}
// 更名的且带选择性的导入
import io = std.stdio : foo = writefln;
void main()
{
//writefln("bar"); // 错误,writefln 未定义
//std.stdio.foo("bar"); // 错误,std 未定义
//std.stdio.writefln("bar"); // 错误,std 未定义
foo("bar"); // 正确,foo 被绑定到当前名字空间
io.writefln("bar"); // 正确,io=std.stdio 将在当前名字空间里的名称 io绑定来引用整个模块
//io.foo("bar"); // 错误,foo 被绑定到当前名字空间, foo 不是 io 的成员
}