Pitfalls of delegates inside ranges

Artur Skawina art.08.09 at gmail.com
Mon Sep 2 07:18:17 PDT 2013


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


More information about the Digitalmars-d-learn mailing list