how to correctly populate an array of dynamic closures?

Dennis dkorpel at gmail.com
Thu Mar 29 15:47:33 UTC 2018


On Thursday, 29 March 2018 at 15:16:07 UTC, Ivan Kazmenko wrote:
> So, why do delegates of guns[] and huns[] all return 1, and how 
> to correctly reproduce the behavior of funs[] while populating 
> it in a loop?

A delegate is a function with a pointer to the stack frame where 
it was created. It doesn't copy or insert the value of 'i', it 
still refers to the very same location in memory as the i from 
the for-loop. After the for-loop, that value is 1, so all 
delegates refering to that i return 1. The solution is to 
generate a new local variable for each closure with a helper 
function:

```
import std.stdio: writeln;

void main () {
     int delegate () [] funs;
     foreach(i; 0..2) {
         funs ~= constantDelegate(i);
     }

     writeln(funs[0]()); //prints 0
     writeln(funs[1]()); //prints 1
}

auto constantDelegate(int num) {
     return () => num;
}
```

Note that since the delegate leaves the scope of 
constantDelegate, the stack frame with the value for 'num' will 
be allocated to the heap because local variables normally don't 
persist after returning from a function.



More information about the Digitalmars-d-learn mailing list