這一版本在強大的民意壓力之下取消了上一版的“隱式轉換表達式為委托”這一特性,取而代之的是一個lazy關鍵字。
取消的理由是這個轉換太隱晦了,最好是顯式地標示出這種轉換,所以引入一個lazy關鍵字。D語言還在發展中,很多特性都在嘗試,這種修改也不是第一次了。
首先看看這個lazy。
上一版實現了這樣一個特性:
void?log(char[]?delegate()?msg){
??writefln(msg());
}
log("Hello,?"?~?"Li?Jie!?\n"?~?"Welcome!");
log的參數被隱式轉化為一個委托,這樣只有用到這個值的時候才真正求值。
由于這種隱式轉化很容易形成陷阱,所以這一版改為一個lazy關鍵字,看起來要簡潔一些了:
void?log(lazy?char[]??msg){
??writefln(msg);
}
log("Hello,?"?~?"Li?Jie!?\n"?~?"Welcome!");
log函數中使用msg這個變量就會調用那個隱式的委托,要注意的是每次取msg的值都會執行這個委托,所以我覺得這個陷阱更大了,當然它把陷阱丟給編寫代碼的人,而不是使用代碼的人,所以好壞還無從分辨。
下面這點代碼可以演示這個小陷阱:
void?foo(lazy?int?a){
??int?b?=?a+1;
??int?c?=?a*3;
??int?d?=?a/2;
}
int?bar(){
??writefln("Call?bar()");
??return?12;
}
foo(bar());
看起來bar好像會執行一次,實際上這段代碼會打印出3行"Call bar()",原來使用委托還可以看到一個顯式的函數調用呢。
另一個member templates特性未見到文檔,猜想大概是支持成員函數模板吧。