Properties: a.b.c = 3

Ary Borenszweig ary at esperanto.org.ar
Wed Jul 29 12:00:42 PDT 2009


Steven Schveighoffer Wrote:

> On Wed, 29 Jul 2009 14:50:42 -0400, Ary Borenszweig <ary at esperanto.org.ar>  
> wrote:
> 
> > Steven Schveighoffer wrote:
> >> On Wed, 29 Jul 2009 14:39:07 -0400, Ary Borenszweig  
> >> <ary at esperanto.org.ar> wrote:
> >>
> >>> a.b.c = d;
> >>>
> >>> If b is anything that has a struct type, and c is anything else, the  
> >>> statement must report an error.
> >>  struct S
> >> {
> >>   int *x;
> >>   void c(int n) {*x = n;}
> >> }
> >>  struct S2
> >> {
> >>   int n;
> >>   S b() { return S(&n);}
> >> }
> >>  void main()
> >> {
> >>   S2 a;
> >>   a.b.c = 5;
> >> }
> >>  Why should this not be allowed?
> >
> > Because in the general case it might not work.
> >
> > It's simple: if you disallow it, no bugs caused because of this can  
> > exist. If you don't disallow it, sometimes it might work, sometimes it  
> > won't work. Which option do you prefer as a programmer?
> 
> I prefer to have the power to create whatever I want without the compiler  
> telling me incorrectly that it won't work.
> 
> why allow any programming at all?  The programmer might write incorrect  
> code!
> 
> -Steve

I reply using the web page because Thunderbird gives me a Bad Request error (very strange).

The cases where you do:

a.b.c = 3;

where b is a struct are probably few, and most of the time they lead to incorrect result, such as the Widget and Rectangle examples, and many others. So I prefer the compiler to tell me "Look, b is a struct, please make sure you know what you are doing". And I can tell you, most of the time you'll say "Thanks, compiler, I didn't notice that!". If the compiler is wrong, you just do:

auto x = a.b;
b.c = 3;

and that's it. No big deal.



More information about the Digitalmars-d mailing list