這個版本實現了計劃已久的數組直接量。
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);
??}
}
數組類型由第1個元素類型決定,類型不匹配將會產生編譯錯誤。
接著是多維數組:
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);
????}
??}
}
另一個特性是更強的typedef。原有的typedef強類型在某些情況下會產生混亂。
下面的代碼摘自 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定義出來的類型和原有類型的相同形式重載函數可以共存,這可以完成更強類型的重載,C++的重載還不能實現這個。
這個強類型的typedef好像原本就支持,大概是運算結果類型比較模糊。
好處是顯頁易見的。比如有一個Time和TimeInterval類型,它用來表示絕對時間或相對時間間隔;另有一個輸出函數用來顯示結果。
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);
}
是的,使用上麻煩了很多,因為我們試圖用一個數值類型去表示多個矢量類型。
這里Time time = cast(Time)100不再只是100這個簡單的數值,它還攜帶了Time這個類型。TimeInterval interval = cast(TimeInterval)100也不只是100這個數值,我們給它賦予了時間間隔的含義。
還可以想像得更開闊一些,用它定義時間、長度、面積、加速度、速度、溫度等,重載一些計算函數(可惜D還不支持全局操作符重載),這樣就方便完成一些物理量的運算了,而且類型得到檢查,速度加一個整數值結果還是速度,速度乘時間得到的是長度,時間減時間得到的是時間間隔,速度加時間將產生編譯錯誤。。。。。。神奇的是這些類型可能都是一些簡單類型,我相信它至少可以保證運行效率不會太低。當然你用C++類也可以完成這些,并且利用編譯器優化讓它的效率保持最高,甚至內聯的結果就是簡單類型的運算,我還是更愿意使用這簡單的類型來typedef。當然這可能需要寫大量重復的函數重載形式,沒有關系,我想使用模板和mixin應該可以簡化這一過程,而且會有相當多的家伙們愿意使用這種麻煩的形式來獲得更“正確”的編譯檢查。
所以說,D語言的typedef的意義其實就是實現了矢量類型。
又多想了一點。
強類型要,語法糖也應該要。是不是可以借鑒一下ruby的語法,實現這種調用呢?
Length?l?=?1.cm;
l?=?1.m;
Time?t?=?Time.now;
TimeInterval?i?=?3.hours;
免去了一些初始化的麻煩。