原文
編譯器更改
1,在object.d
中給TypeInfo_Class
添加了.nameSig
字段
2,總是在調用點
求值像__FILE__
此類關鍵字
3,現在可按整數數組轉換十六進制串
4,添加支持插值式
序列
庫更改
1,isForwardRange,isBidirectionalRange
和isRandomAccessRange
現在帶可選元素類型
2,std.uni
已從Unicode15.0.0
升級到15.1.0
配音更改
fetch
命令現在支持多個參數
,遞歸fetch
,且是項目
相關的.
編譯器更改
1,在object.d
中給TypeInfo_Class
添加了.nameSig
字段
這是類的完整全名
的16
字節md5
簽名.用它來比較兩個類
的等價性
,而不是回退
到比較相當慢
的名字串
.
結果是需要重新編譯druntime
和phobos
以與此更改
兼容.也需要重新編譯庫
.
2,總是在調用點
求值像__FILE__
此類關鍵字
函數的默認參數
可包含__FILE__,__FILE_FULL_PATH__,__MODULE__,__LINE__,__FUNCTION__
和__PRETTY_FUNCTION__
關鍵字.
現在,只要在初化器
中使用,無論是否直接
使用,在更復雜式
的調用函數
的源位置
計算它們.
以前,必須在初化器中直接
使用,以便在調用點
求值.下面是一些示例,現在在調用點
求值更復雜的初化器
:
void func1(const(char)* file = __FILE__.ptr, size_t line = __LINE__)
{//現在,打印`調用函數`文件名.以前它是`func1`自身文件名.printf("%s:%zd\n", file, line);
}struct Loc
{string file;size_t line;
}
void func2(Loc loc = Loc(__FILE__, __LINE__))
{//`loc`變量現在包含`調用函數`的`文件和行`.以前它是`func2`的位置.writeln(loc.file, ":", loc.line);
}
Loc defaultLoc(string file = __FILE__, size_t line = __LINE__)
{return Loc(file, line);
}
void func3(Loc loc = defaultLoc)
{//`loc`變量包含`func3`調用函數的文件和行,而不是`func3`或`defaultLoc`的位置.writeln(loc.file, ":", loc.line);
}
3,現在可按整數數組轉換十六進制串
十六進制串
是嵌入二進制數據
到源文件
中的最有效方法
.但是,因為在CTFE
時禁止再解釋轉換
數組,很難初化short[],int[]
或long[]
.
現在,可按元素類型
大于字節
的整數數組
轉換十六進制串
.與整數文本
寫入方式一致,按大頭序
假定字節序
.
immutable uint[] data = cast(immutable uint[]) x"AABBCCDD";
static assert(data[0] == 0xAABBCCDD);
現在也可用符后綴
來表示大小為2或4
的整數:
immutable ushort[] f = x"80 3F"w;
static assert(f[0] == 0x803F);
immutable int[] f = x"80 35 FF FD"d;
static assert(f[0] == 0x803FFF);
以前,會用1或3
個零
填充每個字節
,但沒有用,見24363
問題.
如果串的字節長度
不是目標元素大小
的倍數,則為錯誤
:
immutable ushort[] e = x"AABBCC"w; //錯誤,`3`字節不是`"ushort.sizeof"`的倍數
4,添加支持插值式
序列
插值式序列
是在庫代碼
中實現串插值
等功能的方法
.添加了三種形式
的字面:
i"Content $(a + 4)"
i`Content $(a + 4)`
iq{Content $(a + 4)}
它們都提供
了相同的東西:一個可傳遞
給其他函數
的元組
,比如std.stdio
的writeln
和std.conv
的文本(text)
:
int a = 6;
writeln(i"Content $(a + 4)"); //打印"內容`10"`
還可把它們傳遞
給理解新core.interpolation
模塊中類型的其他函數
.可在該模塊
文檔或此倉庫中找到許多示例.
庫更改
isForwardRange,isBidirectionalRange
和isRandomAccessRange
現在帶可選元素類型
在Phobos2.106
中,isInputRange
添加了一個可選的第二個模板參數
,以便方便地檢查區間
的元素類型
.現在,已添加相同參數
到isForwardRange,isBidirectionalRange
和isRandomAccessRange
.
如前,如果傳遞第二個類型參數
給其中一個模板,則會檢查區間
的元素類型
,以查看它是否可把限定符轉換為給定類型
,且必須通過此附加檢查
才能求值模板計算
結果為true
.
示例:
//完全匹配
static assert( isForwardRange!(int[], int));
//匹配限定符轉換
static assert( isBidirectionalRange!(int[], const(int));
//不匹配
static assert(!isRandomAccessRange!(int[], string));
std.uni
已從Unicode15.0.0
升級到15.1.0
此Unicode
更新于2023
年9月12
日發布.見這里
import std;
void main()
{const alphaCount = iota(0, dchar.max).filter!(std.uni.isAlpha).walkLength;writeln(alphaCount);//以前:`137765`:現在`138387`,對`"isAlpha"`,有`622`個新`dchar`返回`true`
}
內部Unicode
表(std/internal/unicode_tables.d)
也已更改為使用十六進制串
而不是數組字面
,這樣導入
速度更快.
配音更改
fetch
命令現在支持多個參數
,遞歸fetch
,并且是項目相關的
以前,dub fetch
只能取單個包
,且在獨立
工作目錄工作
.
此版本中,添加
了對多個包的支持,因此現在可實現以下功能
:
$ dub fetch vibe-d@0.9.0 vibe-d@0.9.1 vibe-d@0.9.2
以前無參調用
時,dub fetch
會報錯.但是,它現在試取
當前項目的(如果存在)依賴項
.
最后,取包
時,取其所有依賴項
可能很有用.這是為項目自動完成
的,現在也可直接
手動提取
完成:
$ dub fetch --recursive vibe-d@0.9.0 vibe-d@0.9.1