Properties: problems
Chad J
chadjoan at __spam.is.bad__gmail.com
Wed Jul 29 11:21:41 PDT 2009
John C wrote:
> Here's a couple of annoying problems I encounter quite often with D's
> properties. Would having some form of property syntax fix them?
>
> 1) Array extensions:
>
> class Person {
>
> string name_;
>
> string name() {
> return name_;
> }
>
> }
>
> auto person = getPerson();
> auto firstAndLast = person.name.split(' ');
>
> The above line currently requires parentheses after 'name' to compile.
>
This one is weird. After defining getPerson() I was able to rewrite the
last line into this and make it compile:
auto firstAndLast = split(person.name," ");
Note that you need qoutes, not just ' '.
But even
auto firstAndLast = person.name.split(" ");
does not compile.
main2.d(36): Error: function expected before (), not
split(person.name()) of type immutable(char)[][]
This is probably a compiler bug.
I don't think property syntax is truly necessary for this example. You
are fortunate enough to be using strings, which are passed by reference.
> 2) Indexing:
>
> struct Map(K, V) {
>
> void opIndexAssign(V value, K key) { ... }
> V opIndex(K key) { ... }
>
> }
>
> class WebClient {
>
> private Map!(string, string) headers_;
>
> Map!(string, string) headers() {
> return headers_;
> }
>
> }
>
> auto client = new WebClient();
> client.headers["User-Agent"] = "MyWebClient";
>
> The compiler says client.headers() is not an lvalue (adding 'ref' in D2
> changes nothing).
This is nearly the same thing as the "a.b.c = 3;" example given in the
"a.b.c = 3;" thread. The .b is your .headers. It's slightly more
forgiving though, since you are calling a function on the returned
struct and not accessing a field. The setter never needs to be called
in your example.
I'll use the compiler's rewritting technique to show you what it looks like:
client.headers["User-Agent"] = "MyWebClient";
client.headers.opIndexAssign("User-Agent","MyWebClient");
client.headers().opIndexAssign("User-Agent","MyWebClient");
client.headers() creates a /new/ Map!(...) struct, so the opIndexAssign
will not be called on the one you want it to be called on.
Adding 'ref' should change that. That sounds like a bug.
In this specific example, property syntax is not truly necessary. That
ref returns were added should make this doable.
More information about the Digitalmars-d
mailing list