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