d的别名赋值与{{与闭包
import std;
void main()
{
static foreach(Foo; ["Abc", "def"]) {{
string str = Foo;
writeln("Hello D ", str, __VERSION__);
}}
}
//输出
Hello D Abc2098
Hello D def2098
工作的,
AliasAssign与{{/}}无关,该技巧与() { ... }闭包类似.
亚当:
static foreach是迭代编译时值,特殊在于可在函数外(及内部)使用.在函数外不能用函数内合法的东西,因而仅是些声明,而无嵌套域/表达式.
函数外,静断{{ }}是非法的,因为{}在函数外是非法的,而在函数内,则是合法的,{}用来表示域语句.
void test() {
int a;
{ // 域语句
int b;
}
// a存在,b已完蛋.
static foreach(...)
stuff; // {}省略了
static foreach(...) {
stuff; // 同上
}
// 两个{}
static foreach(...) { //可选{}
{ // 域语句之一
int b;
}
}
}
别名赋值与此无关,它是用未访问的声明来覆盖另一个,给你编译时修改的错觉.
ag0aep6g:
{ ... }与() { ... }不一样,后者不是闭包,也不一定包含闭包.
//只是个域
import std.stdio;
void main()
{
{
string str = "Abc";
writeln("Hello D ", str, 2098L);
}
}
//立即调用的函数字面
import std.stdio;
void main()
{
() {
string str = "Abc";
writeln("Hello D ", str, 2098L);
} ();
}
//返回闭包.
import std.stdio;
void main() { f("Abc")(); }
auto f(string str)
{
return { writeln("Hello D ", str, 2098L); };
}
浙公网安备 33010602011771号