On Thu, 11 Nov 2010 17:57:40 +0100
Daniel Gibson <metalcae...@gmail.com> wrote:

> spir schrieb:
> > Still, an other case when "new" annoys me is method chaining, because it 
> > makes syntax heavier and less readable:
> >     c = (new C(p)).do(x);
> > versus:
> >     c = C(p).do(x);
> > Or, maybe, the parser could be clever enough to correctly decode:
> >     c = new C(p).do(x);
> > 
> 
> Is this really a common case?
> Constructing an object, just to call *one* method on it and then throw it 
> away?

:-) It does not throw it away, instead returns this. And yes, this is common 
practice. For instance in a PEG matching lib, I want to be able to set match 
actions to pattern, like:
        realNumber = new Tuple(digits, DOT, digits).setAction(toFloat);
Or even (by overriding opCall):
        realNumber = new Tuple(digits, DOT, digits)(toFloat);
Very practical: it lets one define the pattern in one go w/o sacrigficing 
readability (well, at least in wy views -- but sure it's dicussable).

> > Second, could there be a default constructor for classes, like for structs? 
> > Namely, one that sets declared fields:
> >     class C {int i;}
> >     ...
> >     auto c = new C(1);
> > This is one great advantage of static languages, that the compiler knows 
> > more thank to declarations. Isn't it sensible to use this knowledge when 
> > helpful? I simply find the following stupid (I mean it's job for a machine, 
> > not for a programmer):
> >     class C {
> >         int i;
> >         this (int i) {this.i = i;}
> >     }
> > As we already enjoy this feature for structs...
> > 
> 
> Again: Is that a common case? A constructor (probably with multiple 
> arguments) 
> that all just set the corresponding fields of the object?

Depends on coding style, probably. If two element mean something together as a 
whole, I like to put them together.

> However, I agree that all that this.i = i; is tedious.
> As I have suggested before in another thread (and Simen did in this thread), 
> something like
> 
> this( int this.i, float this.y, Foo f) {
>      // f is no field of the class.
>      this.b = new Bar(f, i);
> }
> 
> would be helpful because you could mix arguments that are just passed with 
> arguments you want to use in the constructor without too much writing 
> overhead.

Yes, I like this very much. It lets clearly tell apart which params are in fact 
fields, and which ones are params properly speaking.


Denis
-- -- -- -- -- -- --
vit esse estrany ☣

spir.wikidot.com

Reply via email to