在D中,如何声明本身可变的不可变类型的哈希?

约翰·杜塞特

我相信我能够在该语言的早期版本中做到这一点,确实,我几个月前编写的代码现在可以很好地编译,但现在无法编译。例:

immutable(X)[int] myhash;
myhash[5] = some_immutable_X; //previously fine.
myhash[5] = some_other_immutable_X; //previously fine also.

但是,现在dmd抱怨

Error: cannot modify immutable expression myhash[5]

我已经尝试了其他一些可能的语法而没有成功(例如(不可变X)[int])。似乎不再有办法声明哈希本身是可变的,但是内容不是吗?这似乎是一个相当普遍的用例:一种用于存储对不应更改的内容的引用的数据结构。有人对此有见识吗?

乔纳森·戴维斯

如果可行,那就是一个错误(可能是由于void*在AA实现中某处的使用和不正确的转换所致,因为尚未将其正确转换为AFAIK模板)。您不能更改immutable值,并且在执行操作时

myHash[5] = value;

并且其中的元素myHashimmutable,则immutable即使该init值是该类型值,您仍要尝试对其进行突变(因为AA元素在init赋值之前已使用该值进行了初始化,并且类型系统无法得知该元素是否以前在AA中,因此它不能将第一个分配的[]视为初始化,而将其他分配的视为分配)。如果您想要immutable元素的AA ,那么您将需要另一种间接方式,以便元素本身不是immutable而是引用某种东西immutable-例如,通过使用指向immutable类型的可变指针,或者重新处理类,然后使用std.typecons.Rebindable(因为您可以constimmutable 对象)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章