getting rid of immutable (or const)

berni someone at somewhere.com
Thu Sep 5 19:51:47 UTC 2019


On Thursday, 5 September 2019 at 15:48:40 UTC, Ali Çehreli wrote:
> That's the misunderstanding: The existing object is assigned 
> over. The address is the same:
>
> void main() {
>   int[int] aa;
>   aa[1] = 1;
>   const oldPointer = (1 in aa);
>   aa[1] = 11;
>   assert(oldPointer is (1 in aa));  // Passes
> }

First, I thought, I've got understood it now, but then I wrote 
this little program and the result was not, what I thought it 
would be:

> void main()
> {
>     int[int] a;
>
>     immutable int b = 17;
>     a[1] = b;                          // <-- expecting error 
> here
>     const oldPointer = (1 in a);
>     immutable int c = 10;
>     a[1] = c;
>     assert(oldPointer is (1 in a));
>
>     Point[int] d;
>
>     immutable Point e = Point(17);
>     d[1] = e;                           // <-- but error is here
> }
>
> struct Point
> {
>     immutable int x;
> }

What's the difference? I can put an immutable int in an AA and I 
can overwrite it (pointer is still the same), but I can't do that 
with a struct, having an immutable member. When I remove that 
immutable inside of the struct it works. ?!?

While writing this, I had an other idea, namely, that changing 
d[1] would make e to be something different (x inside Point is 
mutable this time):

> Point e = Point(17);
> d[1] = e;
> d[1] = Point(19);
> writeln(e);

But it's still 17.


> const or immutable members make structs unassignable.

But why? Here:

> Point[3] f;
> f[0] = Point(3);

I understand, that I cannot change f[0], because it's allready 
got a default value and that value would be overwritten. But in 
an aa, that member does not exist before putting the Point in 
there, hence there is nothing, that could be overwritten...

> Whether the members of a type are const or immutable should not 
> be dictated by where the objects of that type will be used. If 
> it makes sense otherwise, sure...

I'm not sure if I understand that right. It's sort of an advice 
on how to decide if one want's to make a member immutable or not, 
is it?

> If you are worried about existing elements being modified, you 
> can provide a different container that wraps an AA, but 
> provides an opIndex that returns 'ref const(T)'. That would 
> solve the immutability of the elements in the container.

No, I don't worry about such things. My program runs smoothly 
when I don't make that members immutable. And I could perfectly 
live with that But that's the maxim I used the last three years: 
"If avoidable, don't use 'immutable' at all, it only causes 
problems." But that is not satisfiable. Because if immutable were 
that useless, why would it exist at all? So I would like to 
understand, what's happening; being able to predict, what works 
and what not. At the moment it's almost always the opposite of 
what I think it should be...



More information about the Digitalmars-d-learn mailing list