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

Joh*_*tte 5 d immutability

我相信我能够在早期版本的语言中做到这一点,事实上,几个月前编写的代码,编译得很好,然后现在不编译.例:

immutable(X)[int] myhash;
myhash[5] = some_immutable_X; //previously fine.
myhash[5] = some_other_immutable_X; //previously fine also.
Run Code Online (Sandbox Code Playgroud)

然而,现在,dmd抱怨

Error: cannot modify immutable expression myhash[5]
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*vis 3

如果它曾经有效,那么它就是一个错误(可能是由于 AA 实现中某处的使用void*和不正确的转换,因为据我所知,它还没有正确切换到模板)。你不能改变immutable值,当你这样做时

myHash[5] = value;
Run Code Online (Sandbox Code Playgroud)

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