Match properties as member variables
comco
void.unsigned at gmail.com
Sun Dec 15 15:41:37 PST 2013
On Sunday, 15 December 2013 at 23:38:57 UTC, comco wrote:
> On Sunday, 15 December 2013 at 23:13:39 UTC, Jakob Ovrum wrote:
>> On Friday, 13 December 2013 at 12:01:28 UTC, comco wrote:
>>> From client perspective, properties look like member
>>> variables.
>>> With (auto) ref, a generic function can catch a member
>>> variable and read it and update it:
>>>
>>> void swap(T)(ref T a, ref T b) {...}
>>>
>>> The client can use swap with member variables.
>>> But he can't use this swap with class properties - they're
>>> special.
>>>
>>> Since the properties "look like" member variables, I think it
>>> is a valid use-case for us to want to be able to write
>>> generic code that can handle properties passed as arguments
>>> in the same way as member variables passed as arguments.
>>>
>>> Can you write version of swap, which works also with
>>> properties and/or combination of properties and references?
>>
>> The issue is that reference parameters expect lvalue
>> arguments, while property functions that return by value
>> result in rvalues. It's the same reason you can't do `swap(1,
>> 2)` - the literals `1` and `2` are rvalues.
>>
>> You can make your property getters result in lvalues by
>> returning by reference. The syntax mirrors that of reference
>> parameters:
>>
>> ---
>> struct S
>> {
>> private int _i;
>>
>> ref int i() @property
>> {
>> return _i;
>> }
>> }
>>
>> void main()
>> {
>> S s1, s2;
>>
>> s1.i = 1;
>> s2.i = 2;
>>
>> import std.algorithm : swap;
>> swap(s1.i, s2.i);
>>
>> assert(s1.i == 2);
>> assert(s2.i == 1);
>> }
>> ---
> I know why it doesn't work with the language as it is. This is
> more like a language design question. The problem is at another
> level - "linguistic" level - the properties are introduced in
> the language as a convenience - Java goes well without them -
> with the purpose of making methods "look like" member
> variables. The ref property will work with swap, but the
> general case of a getter + a setter of the same property will
> not work, because we have two methods, which, in combination,
> from the outside world, need to look like member variables. But
> today, the properties mimic variable behavior only in the
> simple cases (they can't be "passed by ref" as variables do).
> So the point is that at a higher conceptual level, properties
> are only partially supported as a client-transparent
> alternative to member variables.
I'm not saying that 'ref'-s are bad; I'm just saying that we lack
the syntactic ability to write a function, which accepts a
"property" - a read-write enabled entity, supporting a particular
type, which in disguise calls the corresponding getter/setter
methods.
More information about the Digitalmars-d-learn
mailing list