第1项:ulong
串字面和NUL
终止
Martin
说,他一直在为LDC
开发新的ulong
串字面,并想知道是否应该像普通串字面
一样以无效
结尾.沃尔特问他是什么意思,因为串字面
总是秘密地以无效
结尾.
丹尼斯问同样规则
是否适合十六进制串字面
,这就是马丁的意思.沃尔特说不.Dennis
说内部可按串式
表达十六进制数组串
或其他数组
.
即使它是个整数数组
,编译器仍在数据段中分配
一个空字节.
Walter
说编译器按二进制数据
转换十六进制串字面
,并问你为何要空字节
.Dennis
说,这并不是你想要的,而是编译器在生成代码
中,看到串式
时,只是在生成代码
中添加了一个零终止符
.
串式
不必是串字面
.可以是数组
,import
语句或十六进制串字面
.在内部,有多种方法
可以创建不是串字面
的串式
.
Walter
说,应该只对实际的串字面
,隐式无效
.马蒂亚斯问在其他地方这样做
是否有坏处
.因为在数组
后面放置它,所以仅当取指针
时才重要.
史蒂夫说这是对的.测试应该是"编译器是否显式按符指针转换它
",此时,它应该添加终止符
.
Paul
说,他非常确定有些代码依赖终止零符
的当前行为
,或针对CTFE
生成的串,因此他会谨慎地更改它.Walter
同意,但表示这些正在创建串字面
,因此都应该总是加终止符
.
丹尼斯说他不确定
它.有时你可从一个字符数组
创建一个内部
仍是一个字符数组的串
.不确定编译器是否此时
添加了终止符.
Martin
说,在LDC
中实现新的64
位十六进制串字面时,他有两个特例
.第一个是他不是零终止
他们.第二个是他不打算缓存它们
.
所有其他串字面
都可跨目标文件
合并.因为这些十六进制串
旨在表示二进制数据
,所以不会对空终止符
感兴趣,他假设它们会比平均串字面
大.
他快速浏览了一下DMDPR
,似乎无特例.因此,在DMD
中,它们可能仍是零终止
的,并像其他串字面
一样跨目标文件
合并.
Walter
问,如果它要进入静态数据
,为什么不想它合并
.马丁说,测试会很贵,因为他按缓存键
使用串自身
.他不知道Phobos
中使用此函数的新统一
表,但它们可能非常大,比如几兆字节
左右.
此时,成本
会很贵.假设你不太可能在目标文件
中复制这些十六进制串
.
沃尔特说这是对的.Martin
说,他的主要观点是他期望会改变规范
,但这在更新日志
中,甚至没有提到.它提到你可按ulong
文本转换任意串字面
,但编译器已更改,串式的符大小
现在可为8字节
.
沃尔特问丹尼斯能不能处理好这件事.丹尼斯说他会的.
第2项:弃用Nullable
上的区间API
函数
丹尼斯链接到乔纳森提交但后来关闭的公关.PR
弃用了按区间
对待Nullable
.他想知道对此的看法.
他说他在C#
中经常使用nullables
,并且很喜欢它们.
但是C#
有特殊的符号可与System.Nullable
一起使用.在这些符号出现前,人们还没有真正在C#
中使用过Nullable
.
如,当有Nullable
并且它是无效
时,则问题就是默认值
应该是什么,且在赋值给它时有个符号
可用它.所以他想知道是否可在D中完成,Jonathan
给了他一个列表,说明为什么这在D中不管用.
他说的Nullable
实际上还不是nullable
.也许它是一个可选的,或只是一个类型,弄错了名字.因为没用它做nullable
可做的事情.
所以Nullable
应该是个区间
,他不这么认为.nullable
只是说该数据可附加一个无效
值,而数据自身不是null
.
Paul
同意的Nullable
与C#
不同,它实际上是一个可选
的类型,或是一个有误导性名
的类型.在Phobosv3
中,应该重命名它并添加一个实际的C#
风格的nullable
,但这与本次讨论无关.
至于Phobosv2
,试用与C#
的nullable
的比较按其设计的指导原则是有限的.
蒂蒙说,他也想提出类似的观点.显然,Nullable
或Optional
或其他容器,如果你弹出
它,区间接口
会改变区间
.当调用popFront
时,不想更改动态数组
的底层静态数组
.
atila
说这很简单:只需在object.d
中放置
数组区间API
即可.但他想D数组
隐式是区间,而不必显式
地说它们是区间
.
这样事情更简单.阿蒂拉同意了.这里
这是他对DMD
代码基的一个大目标:查看其中的一部分,弄清楚它在做什么,然后覆盖它,使其非常简单.
Paul
说,小概率,当你在编写某种低级代码
时,或当你已单独
完成了检查时,应该可在不检查
时访问nullable
的值.
但它可能应该叫uncheckedGet
或unsafeGet
之类名,而不仅是get
.
检查char
数组的内容都应叫"chars"
,如果期望为零终止,则应叫"charz"
.他说这是对的.应该停止在标准库中组合"串"和"符数组
".
Jonathan
反驳说,大多数串处理并不关心数组是可变的还是不变的.沃尔特同意,但坚持认为可变的符数组
与串
完全不同.
罗伯特说这似乎太像C++
概念了,他不想这样.Dennis
提到了Rust
的特征.atila
提出了Haskell
类型的类.
Paul
说,在D语言中检查模板类型
的方式类似在Python,js,Ruby
等动态语言中,检查代码类型
的方式.
使用这些语言的在处理类型检查引起的问题时达成的共识是带强大的单元测试规则.这是D前进的最佳路径.
然后,atila
带回了Phobos
文档,说最好有更通用的指导方针,如"避免分配"或"避免异常",而不是API
应该是什么样子的细节.这里面有太多的味道.
在v3
中不需要它.不会在串
上做太多的重载,因为专注于char
数组而不是dchar
.无论是否保留它,在v3
中,Phobos
都不必.
史蒂夫说,最小更好.一旦一个特征
在那里,它就在那里,就会被它困住.他说,那些可用is
式替换的简单特征,Dennis
在聊天中提出了一个很好的观点,即你不能调用is
式或把__traits
传递给模板.
这是另一件需要考虑的事情.
丹尼斯说,也许人们更喜欢__traits,
因为他们不喜欢导入std.traits
来使用它们.沃尔特说,另一个很好的区别
是,没有增加内置的成本
.
标准库的特征,按模板,是有成本的.
拉兹万建议,或是,如果某些__traits
有用,则应该考虑美化
它们,并为它们制作一些额外的语法
,让他们变成一等公民
.