static vs non-static

Era Scarecrow rtcvb32 at yahoo.com
Tue Jan 15 14:03:23 PST 2013


On Sunday, 13 January 2013 at 16:39:22 UTC, bearophile wrote:
> Maxim Fomin:
>
>> dmd allows to call static functions on instance.
>
> I think that's a D design mistake (and I think Jonathan Davis 
> agrees with me), but Walter prefers the current behavour.

  I'll have to disagree and it should remain an error.

  Consider his example, if it were allowed and you do:

  Gun gun;
  Gun.bar();
  gun.bar();

  What would happen? The first would call the static and the 
second would call the non-static. Overloading-wise their 
signatures are identical (static doesn't count). The difference 
in the calls is a single letter and can easily go under the 
radar; Without an actual difference in the signature it would be 
easy to confuse the two. Now had one required an input then they 
couldn't be messed up.

  Let's go with a slightly more confounding example.
   struct S {
     int x;
     int opIndex(int i){return i;}

     //non-instance is always 0
     static int length() {return 0;}
     int length() const {return x;}
   }

  Assuming a function should call this (Say a foreach? once 
there's more methods?), which is the correct length to call? If 
the static is preferred then length is always 0, if non-static is 
preferred (although slimmer) the length of 0 being returned by 
accident is always there. If the static length is private, then 
inside the struct S you always have to reference 'this.length' vs 
'S.length' to keep them separate just to be sure.


  I recall reading somewhere that in Java that technically calling 
a static function by a instance was an error but instead only 
gave you a warning; Kinda makes sense since methods affect it's 
instance but static functions don't have an instance to work 
with; They were more for functions that needed to be free but 
couldn't due to the strict 'everything is an object' setup.


More information about the Digitalmars-d-learn mailing list