创建用户定义的不可变对象
Creating user defined immutable objects
immutable auto a = Array!int([1, 2, 3]);
Error: cannot implicitly convert expression (((Array!int __slArray2557 = Array(RefCounted(RefCountedStore(null)));) , __slArray2557).this([1, 2, 3])) of type Array!int to immutable(Array!int)
通常我只是想在运行时创建一些对象,初始化它然后使它不可变但是如果我尝试这样做,我会从上面得到错误。
看来我可以将可变对象转换为不可变对象
immutable auto a = cast(immutable Array!int) Array!int([1, 2, 3]);
为什么我必须将其转换为 immutable
?
强制转换为不可变是否合法?
由于 Array
是引用计数的,它现在与不可变不兼容 - 它在其中保留一个指向引用计数的指针,如果它是不可变的,则不能更改,从而破坏了整个事情。转换只是绕过规则,编译但未定义行为。
如果它是不可变的,只需放弃 Array
包装器并使用普通切片:
// this works fine
immutable a = [1, 2, 3];
(哎呀,如果你传递一个文字,数组包装器基本上是无用的,因为构造普通数组只是为了传递给它的构造函数,在那里它再次构造!)
顺便说一句,immutable auto
中的 auto
是不必要的,您可以直接调用它 immutable
。
您还可以制作一个由不可变数据组成的可变数组,它应该也能工作——它只需要可变性,因为它的内存管理方案。
immutable auto a = Array!int([1, 2, 3]);
Error: cannot implicitly convert expression (((Array!int __slArray2557 = Array(RefCounted(RefCountedStore(null)));) , __slArray2557).this([1, 2, 3])) of type Array!int to immutable(Array!int)
通常我只是想在运行时创建一些对象,初始化它然后使它不可变但是如果我尝试这样做,我会从上面得到错误。
看来我可以将可变对象转换为不可变对象
immutable auto a = cast(immutable Array!int) Array!int([1, 2, 3]);
为什么我必须将其转换为 immutable
?
强制转换为不可变是否合法?
由于 Array
是引用计数的,它现在与不可变不兼容 - 它在其中保留一个指向引用计数的指针,如果它是不可变的,则不能更改,从而破坏了整个事情。转换只是绕过规则,编译但未定义行为。
如果它是不可变的,只需放弃 Array
包装器并使用普通切片:
// this works fine
immutable a = [1, 2, 3];
(哎呀,如果你传递一个文字,数组包装器基本上是无用的,因为构造普通数组只是为了传递给它的构造函数,在那里它再次构造!)
顺便说一句,immutable auto
中的 auto
是不必要的,您可以直接调用它 immutable
。
您还可以制作一个由不可变数据组成的可变数组,它应该也能工作——它只需要可变性,因为它的内存管理方案。