原文
编译器更改
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