Possible @property compromise
Zach the Mystic
reachBUTMINUSTHISzach at gOOGLYmail.com
Sat Feb 2 23:26:02 PST 2013
On Sunday, 3 February 2013 at 03:34:23 UTC, Era Scarecrow wrote:
> Agreed 100%, Although a second (instance of) Dog may want to
> come about and them sniff tails. That's outside access, but
> it's still within the limits of the Dogs. In those cases a
> context pointer could be acceptable as long as it's ensuring
> the data exists (and can't return it from the function); But
> overwriting one instance with a different context pointer of
> another could have very curious side effects depending on
> design.
>
> struct Dog {
> int id;
> struct Tail {
> string colorOf = "Black"; //just data.
> int getId() { return id; }
> }
> Tail tail;
>
> void func(ref Dog rhs) {
> //tail2 retains context pointer to rhs.
> Tail tail2 = rhs.tail;
>
> writeln(tail.getId()); //5
> writeln(tail2.getId()); //10
> }
> }
There is a bug in this code and it would not compile. Your getId
must receive an instance of Dog. A tail by itself has no dog. The
compiler cannot rewrite tail.getId() to
someImaginaryDog.tail.getId(). It's easy to think about, once you
get used to it. Your getId accesses a variable defined only in
its parent struct. The compiler detects this and requires
receiving a hidden pointer to (and *only to!*) an instance of the
parent. The resulting top-level function is:
int getId(ref Dog __d) { return __d.id; }
See? It may only access a dog, but it's *defined* in the tail.
This is the exact behavior we're looking for, and it's easy to
implement and causes no real trouble, as far as I can see.
> Dog dog1 = Dog(5);
> Dog dog2 = Dog(10); dog2.tail.colorOf = "White";
>
> dog1.func(dog2);
>
> //context pointer of d2 thrown away after copy,
> //unless opAssign declared and does something.
> dog1.tail = dog2.tail;
>
> assert(d1.id == 5); //untouched
> assert(d1.tail.colorOf == "White");
>
>
> At which case the tail if it's allowed to be copied should be
> related but not strictly required to be updated or relied on
> Dog for behavior.
>
> Guess it takes a few rules and experiments to find the right
> balance of accessibility vs reliability vs flexibility.
With the bug removed, will any of these issues pop up? My guess
is no.
More information about the Digitalmars-d
mailing list