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