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