On 09/02/13 15:49, Joseph Rushton Wakeling wrote:
> On 02/09/13 15:39, Artur Skawina wrote:
>> While this may not seem ideal, sometimes you do *not* want to do it
>> (when you need to keep the original context), so there are no obvious
>> alternatives that would handle all cases automagically.
> 
> I'm sure there are valid use cases where this behaviour is desirable.  In 
> fact, all approaches to creating reference-type structs rest on this, 
> although in those cases the reference is usually a pointer to a payload 
> rather than a delegate to a function.
> 
> The point is, it's a risk if you don't appreciate how value and reference 
> types intermingle -- and even when you do in principle, it's easy to 
> accidentally overlook in practice.  The Phobos unittests, which for 
> RandomSample are very extensive, didn't catch this problem.

Requiring captures to be explicit would reduce the chance of such
bugs happening, but also have a significant cost and be a rather
drastic change to the language...

In this case, there's no need for a delegate, as you do not want
to operate on the original object. So you can simply do:

    //...
    private void function(ref typeof(this)) _jump;
    private void jump() { _jump(this); }

    this(size_t max)
    {
        _max = max;
        _jump = &jump10;
    }
    //...        
    static jump10(ref typeof(this)this_)
    {
        this_._count += 10;
        writeln("At end of jump, count = ", this_._count);
    }

It's cheaper than the other alternative (updating ctx in cpctor),
but slightly more verbose. More importantly, AFAICT, this is a
better fit for the actual problem.


artur

Reply via email to