Well, if you really want a "protected" associative array, or array for
that matter, you probably should define a wrapper class that inlines the
access you're willing to allow.
From a basic perspective, _testMap is a structure of data. Although it
is private, there's no reason it can't be modified through an accessor.
Without a setter, the only thing that should fail is test.testMap =
something. Requiring a setter for any minor change makes no sense.
Compare it to this: if you have a class that has a member object (e.g. a
User with a Socket member variable), should it be necessary to have a
setter to change the Socket? Can't the Socket handle its own
private/public-ness?
Arrays and associative arrays are the same, except that the members you
use are public.
-[Unknown]
Tyro[a.c.edwards] wrote:
On 5/3/2009 6:25 PM, Unknown W. Brackets wrote:
This code works fine (D 2.x only):
class Test
{
private int[int] _testMap;
public ref int[int] testMap() {return _testMap;}
}
void main()
{
Test test = new Test();
test.testMap[0] = 1;
}
Note the "ref". Otherwise, a value is returned which is not modifiable.
This will also fix test.array.length. Nothing wrong here, no creepy bad
temporary property problems.
Is this an intended or even desirable "feature" of the language or just
something that happens to work in D 2.x? I ask because to the untrained
eye, it is unclear exactly what is happening. There is nothing to inform
me that _testMap can be modified from outside the class. Even with "ref"
there it doesn't make it any clearer.
Matter of fact, I just had a problem in Phobos 2 where a function was
defined like that and I had to comment out the "ref" for it to work.
Kept telling me that some array was not an lvalue. The minute I
commented out the "ref", everything worked like a charm.
Also it makes more sense to me to have separate functions as getters and
setters. Maybe that's only because I lacking proper training in the art
of computer programming though.
I suppose you could also try returning a pointer to an associative array
(e.g. with &) in D 1.x.
-[Unknown]
flourish wrote:
Hi,
why does the following code not compile -- or how to declare a (usable)
property of an associative array field?
//////////////////////
class Test
{
private int[int] _testMap;
public int[int] testMap() {return _testMap;}
}
void main()
{
Test test = new Test();
test.testMap[0] = 1;
}
/////////////////
*** Error: test.testMap() is not an lvalue
Regards,
flourish