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); };
}
上一篇:Swift语言实战晋级


下一篇:如何将list集合转成树形格式?