Google's Go

Lars T. Kyllingstad public at kyllingen.NOSPAMnet
Mon Jan 25 06:05:11 PST 2010


Steven Schveighoffer wrote:
> On Sun, 24 Jan 2010 04:25:21 -0500, grauzone <none at example.net> wrote:
> 
>> Or how inout(T) isn't just a shortcut to avoid writing 
>> const/immutable-aware code 3 times or putting it into a template?
> 
> The benefits are:
> 
> - Single implementation where all that is different is the type 
> qualifier.  (also allows the function to be virtual)
> - No propogation of contract through an accessor.  In other words, using 
> an inout accessor on an object or struct does not alter the caller's 
> contract with the data itself.
> 
> The latter function is almost essential for properties, for without such 
> a mechanism, you are forced to write your property definitions in 
> triplicate.
> 
> i.e.
> 
> class C {}
> 
> struct S
> {
>    C c;
> }
> 
> immutable s1 = S(new C);
> S s2 = S(new C);
> 
> immutable c1 = s1.c;
> C c2 = s2.c;
> 
> Now, change S.c into a property.
> 
> The first line of thinking is, "well, accessing c doesn't change the 
> object itself, so it should be const."  But that means you must return a 
> const(C), so it breaks defining c1 and c2 (can't assign immutable or 
> mutable from const).
> 
> So, you say, "I'll just define it without const," but then you can't 
> call the property unless S is a mutable type, so that only works in c2's 
> case
> 
> Maybe you think you can get away with just mutable and immutable, but 
> again, it doesn't work if the whole object is const, since you can't 
> call either function from there.
> 
> Templates won't work here, you cannot template the 'this' pointer.  So 
> you end up with 3 identical implementations, and *no* const guarantee on 
> the mutable one:
> 
> @property C c() { return _c; }
> @property const(C) c() const { return _c; }
> @property immutable(C) c() immutable { return _c; }


Out of curiosity:  How does inout(T) fix this?  I thought inout was all 
about transporting the const-ness of the input type to the return type, 
and in this example there are no input parameters.

-Lars



More information about the Digitalmars-d mailing list