Immutable array initialization in shared static this

Jonathan M Davis jmdavisProg at gmx.com
Fri Jul 13 03:28:42 PDT 2012


On Friday, July 13, 2012 12:15:33 Tommi wrote:
> The following code doesn't compile. It seems like a compiler bug
> to me, but I can't find a bug report about it. Is it a bug?
> 
> private immutable(int[]) constants;
> 
> shared static this()
> {
>      constants.length = 10;
>      constants[0] = 123; // Error: constants[0] isn't mutable
> }

It's not a bug. You have to initialize the entire array at once, since it's 
immutable. By setting the length, you initialized the array such that it had 
10 elements in it all of which were the init value of the element type (which 
would be 0, since it's int). If you don't want to use an array litera like

constants = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

then create a mutable array which you then either idup and assign it to 
constants, or you cast it to immutable (or use std.exception.assumeUnique, 
which casts to immutable but is used to document the fact it is the only 
reference to that data and therefore safe to cast to immutable) and then 
assign it to constants.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list