On Thursday, 13 July 2023 at 11:55:17 UTC, Ki Rill wrote:
> Why does the first example class A
work, but the second one with class B
does not?
class A {
immutable int a;
this(in int a) {
this.a = a;
}
}
class B {
immutable int[] b;
this(in int[] b) {
this.b = b;
}
}
void main()
{
auto a = new A(1);
auto b = new B([1, 2]);
}
It implicitly converts const
to immutable
, but fails to do the same with an array. Is it intentional? Why?
Yep: immutable
is data that cannot ever change. If you could convert int[]
to immutable int[]
, you could do this:
int[] a = [2];
immutable(int)[] b = a;
auto first = b[0];
a[0] = 3;
auto second = b[0];
// Wait, this fails? I thought `b` was immutable.
assert(first == second);
Use array.idup
(immutable dup) to turn int[]
into immutable int[]
.
And you can convert int
to immutable int
because it's a "value copy": you cannot mutate the immutable variable through an assignment to the original. Generally speaking, only the constness of referenced data matters for assignment.
That's why you can assign string
to immutable string
, because string
is immutable(char)[]
: the referenced data is immutable in both cases.