Graydon Hoare wrote:
The_observational_  difference, on an owned value (i.e. you're the only
person who can even see the vector in question) is really just that the
latter would do a bunch of allocation, copying and freeing, and wind up
pointing to a different place containing exactly the same result. From
the perspective of the surrounding code, if it's not actually paying
attention to pointer values, those two lines are identical.

There is one difference here that's been brought to my attention and is worth pointing out (though I don't think it's a problem). If the objects in question have a destructor, then:

    x = X { f: x.f + 1 };

and

    x.f += 1;

are observationally different, since the first one will run a destructor but the second will not. I think the bottom line here is that if you have destructors, you should probably use privacy to guard the values of those fields that you do not want modified.

One change that one could imagine is adding some sort of qualifier for fields that cannot be modified *directly*, so that the first assignment would be legal but the second not. Note that we still could not say that `f` is *immutable*, because it could still be mutated, but you could call it "const" or something like that. I personally would prefer to see how far we can get using privacy instead just to keep things simple, but this remains a potentially useful addition. Declaring fields that should not be changed after the object is constructed is after all not uncommon.


Niko
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to