properties
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Mon Jul 27 15:37:01 PDT 2009
Steven Schveighoffer wrote:
> The "getter" notation that currently exists only has a few minor
> problems. The most major of those problems is if the return value is a
> callable type, such as a delegate, you can't easily perform the call on
> the returned value.
Thanks for a very lucid analysis! So let me give an example:
class A
{
int delegate() wyda()
{
return delegate int() { return 5; };
}
}
void main(string[] args)
{
auto a = new A;
auto b = a.wyda;
writeln(typeof(b).stringof);
auto c = a.wyda();
writeln(typeof(c).stringof);
auto d = a.wyda()();
writeln(typeof(d).stringof);
auto e = &a.wyda;
writeln(typeof(e).stringof);
}
This program prints:
int delegate()
int delegate()
int
int delegate() delegate()
I agree that that's an issue. One can't currently implement
transparently a property that returns a delegate taking no arguments.
There's an extra () needed.
> Being that it isn't very bad for the getter
> property, would it make sense to leave that functionality? That is:
>
> 1. A setter must be defined in the opSet_X(int x) form
> 2. A getter can be a function with no required arguments, but this
> getter should not return callable types
... with zero arguments.
> 3. A getter can be defined in the opGet_X() form, and then using X()
> will be the eqivalent of opGet_X()().
>
> There are small implications to leaving the existing getter syntax.
> Namely one can call a function not intended to be a getter in a
> property-like syntax, resulting in less-than-obvious code.
This I don't agree with. I am very happy that I define popFront() as a
method and then call it without parens.
> Also, this
> distinction will be very hard to explain to newbies ("how come a getter
> is defined as x(), but a setter has to be opSet_x(...)?).
I don't see that as a problem. You just explain that the trailing () is
not necessary, and then you tell them to define opSet_x if they want to
enable obj.x = y.
> The more I look at it, the more I like the keyword solution. I do find
> the C#-like syntax which groups properties together appealing, but I
> think you only absolutely need that if you are going to have
> context-keywords, which I DON'T think we need. I do find the whole
> construct of C# properties tedious to type.
>
> With a keyword attribute, you could even group your properties together
> to save on typing/ugliness:
>
> property
> {
> int x() {}
> void x(int n) {}
> bool empty() {}
> }
Not a fan, but this would work. I just don't see why I need to go
through with it.
Andrei
More information about the Digitalmars-d
mailing list