ref returns and properties
Jacob Carlborg
doobnet at gmail.com
Mon Jan 26 04:25:45 PST 2009
Andrei Alexandrescu wrote:
> Michiel Helvensteijn wrote:
>> Andrei Alexandrescu wrote:
>>
>>> void move(ref T src, ref T dst);
>>> void swap(ref T lhs, ref T rhs);
>>>
>>> ...
>>>
>>> But if "prop" is a property with get and set, everything falls apart.
>>> Properties effectively hide the address of the actual data and only
>>> traffic in values. That's often good (and sometimes even the only
>>> possibility in the case of properties computed on-the-fly), but this
>>> abstraction effectively makes resource-conserving move and swap
>>> impossible.
>>>
>>> ...
>>>
>>> What to do? I'd like to refine the notion of property such that moving
>>> properties around is possible, without, however, complicating their
>>> interface too much.
>>
>> I posted a possible solution to this (I think) in the last properties
>> thread. I was thinking that properties might be equiped with extra member
>> functions. One advantage is that you might get more efficiency. I
>> think you
>> just named another.
>>
>> class Host
>> {
>> property prop
>> {
>> T get() { ... }
>> void set(T value) { ... }
>> void move(ref T dst) { ... }
>> void swap(ref T rhs) { ... }
>> }
>> }
>
> But these are too many. These should suffice:
>
> class Host
> {
> property prop
> {
> T get();
> void acquire(ref T value) { ... }
> void release(ref T value) { ... }
> }
> }
>
> set() can be implemented as acquire from a copy, and swap can be
> implemented by calls to acquire and release. Technically, get() could be
> also implemented with acquire and release, but that's too intensive for
> most types.
>
> The problem I'm seeing is that most people won't want to go through the
> trouble of implementing three functions for one property.
>
>
> Andrei
>
What about this:
class Host
{
property acquire release prop
{
T get();
}
}
And then the compiler will automatically created the "acquire" and
"release" methods.
There could also be what I would like to call "property shortcuts" (ruby
calls this attributes) like this:
class Host
{
get acquire release T prop;
get set T prop2;
}
More information about the Digitalmars-d
mailing list