這個(gè)版本實(shí)現(xiàn)了計(jì)劃已久的數(shù)組直接量。
import?std.stdio;
void?main(){
??{
????static?int[]?arr?=?[1,2,3,4,5];
????writefln(typeid(typeof(arr[0])));
????writefln(arr);
??}
??{
????static?float[]?arr?=?[1f,1,3,4,5];
????writefln(typeid(typeof(arr[0])));
????writefln(arr);
??}
??{
????static?char[][]?arr?=?["1","2","3","4","5"];
????writefln(typeid(typeof(arr[0])));
????writefln(arr);
??}
}
數(shù)組類型由第1個(gè)元素類型決定,類型不匹配將會(huì)產(chǎn)生編譯錯(cuò)誤。
接著是多維數(shù)組:
import?std.stdio;
void?main(){
??static?int[][]?arr?=?[[1,2,3,4],?[4,5,6],?[7,8]];
??foreach(int[]?sub;?arr){
????foreach(int?i;?sub){
??????writefln(i);
????}
??}
}
另一個(gè)特性是更強(qiáng)的typedef。原有的typedef強(qiáng)類型在某些情況下會(huì)產(chǎn)生混亂。
下面的代碼摘自 http://www.digitalmars.com/pnews/read.php?server=news.digitalmars.com&group=digitalmars.D.bugs&artnum=3843
import?std.stdio;
typedef?int?Int1;
typedef?int?Int2;
void?show(Int1?v)?{
?????writefln("Int1:?%d",?v);
}
void?show(Int2?v)?{
?????writefln("Int2:?%d",?v);
}
void?show(int?i)?{
?????writefln("int:?%d",?i);
}
void?show(long?l)?{
?????writefln("long:?%d",?l);
}
void?main()?{
?????Int1?value1?=?42;
?????Int2?value2?=?69;
?????show(value1?+?value2);
?????show(value2?+?value1);
?????show(2?*?value1);
?????show(value1?*?2);
?????show(value1?+?value1);
?????show(value2?-?value2);
?????show(value1?+?2);
?????show(3?+?value2);
?????long?l?=?23;
?????show(value1?+?l);
?????show(l?+?value2);
?????short?s?=?105;
?????show(s?+?value1);
?????show(value2?+?s);
}
如上面代碼所示。typedef定義出來(lái)的類型和原有類型的相同形式重載函數(shù)可以共存,這可以完成更強(qiáng)類型的重載,C++的重載還不能實(shí)現(xiàn)這個(gè)。
這個(gè)強(qiáng)類型的typedef好像原本就支持,大概是運(yùn)算結(jié)果類型比較模糊。
好處是顯頁(yè)易見(jiàn)的。比如有一個(gè)Time和TimeInterval類型,它用來(lái)表示絕對(duì)時(shí)間或相對(duì)時(shí)間間隔;另有一個(gè)輸出函數(shù)用來(lái)顯示結(jié)果。
import?std.stdio;
import?std.string;
typedef?long?Time;
typedef?long?TimeInterval;
void?output(Time?t){
??writefln("Time:?"?~?toString(cast(long)t));
}
void?output(TimeInterval?t){
??writefln("Interval:?"?~?toString(cast(long)t));
}
void?main(){
??Time?time?=?cast(Time)100;
??TimeInterval?interval?=?cast(TimeInterval)100;
??output(time);
??output(interval);
}
是的,使用上麻煩了很多,因?yàn)槲覀冊(cè)噲D用一個(gè)數(shù)值類型去表示多個(gè)矢量類型。
這里Time time = cast(Time)100不再只是100這個(gè)簡(jiǎn)單的數(shù)值,它還攜帶了Time這個(gè)類型。TimeInterval interval = cast(TimeInterval)100也不只是100這個(gè)數(shù)值,我們給它賦予了時(shí)間間隔的含義。
還可以想像得更開闊一些,用它定義時(shí)間、長(zhǎng)度、面積、加速度、速度、溫度等,重載一些計(jì)算函數(shù)(可惜D還不支持全局操作符重載),這樣就方便完成一些物理量的運(yùn)算了,而且類型得到檢查,速度加一個(gè)整數(shù)值結(jié)果還是速度,速度乘時(shí)間得到的是長(zhǎng)度,時(shí)間減時(shí)間得到的是時(shí)間間隔,速度加時(shí)間將產(chǎn)生編譯錯(cuò)誤。。。。。。神奇的是這些類型可能都是一些簡(jiǎn)單類型,我相信它至少可以保證運(yùn)行效率不會(huì)太低。當(dāng)然你用C++類也可以完成這些,并且利用編譯器優(yōu)化讓它的效率保持最高,甚至內(nèi)聯(lián)的結(jié)果就是簡(jiǎn)單類型的運(yùn)算,我還是更愿意使用這簡(jiǎn)單的類型來(lái)typedef。當(dāng)然這可能需要寫大量重復(fù)的函數(shù)重載形式,沒(méi)有關(guān)系,我想使用模板和mixin應(yīng)該可以簡(jiǎn)化這一過(guò)程,而且會(huì)有相當(dāng)多的家伙們?cè)敢馐褂眠@種麻煩的形式來(lái)獲得更“正確”的編譯檢查。
所以說(shuō),D語(yǔ)言的typedef的意義其實(shí)就是實(shí)現(xiàn)了矢量類型。
又多想了一點(diǎn)。
強(qiáng)類型要,語(yǔ)法糖也應(yīng)該要。是不是可以借鑒一下ruby的語(yǔ)法,實(shí)現(xiàn)這種調(diào)用呢?
Length?l?=?1.cm;
l?=?1.m;
Time?t?=?Time.now;
TimeInterval?i?=?3.hours;
免去了一些初始化的麻煩。