Delegates can be a pain, as they often have results different from what one would intuitively expect. This can easily result in bugs.
Here's a line that caused a bug that took me awhile to find:
foreach(card; unitCards) card.submitted = delegate() => selectUnit(card.unit);
Each UnitInfoCard object (which card is a member of) contains a Unit object called unit. The intention of this line was that each object in unitCards would call selectUnit with it's own unit every time it calls submitted. Instead, every card calls submitted with the last value of card.
This is because the delegate assignment causes the local card variable to remain alive. The delegate that's assigned is linked to this variable itself, not the value at the time that the delegate is assigned.
Is there a way I can dereference a variable when placing it in a delegate, so that it's current value is used, rather than the variable itself?
Permalink
Reply