www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Closures over temporary variables

reply Anonymouse <zorael gmail.com> writes:
What is the correct way of making this output `0 1 2`?

```d
void delegate()[] dgs;

foreach (immutable i; 0..3)
{
     dgs ~= () => writeln(i);
}

foreach (dg; dgs)
{
     dg();  // outputs: `2 2 2`
}
```
Jun 14 2022
parent reply bauss <jj_1337 live.dk> writes:
On Tuesday, 14 June 2022 at 08:26:53 UTC, Anonymouse wrote:
 What is the correct way of making this output `0 1 2`?

 ```d
 void delegate()[] dgs;

 foreach (immutable i; 0..3)
 {
     dgs ~= () => writeln(i);
 }

 foreach (dg; dgs)
 {
     dg();  // outputs: `2 2 2`
 }
 ```
You have to do it like this: ``` dgs ~= ( (n) => () { writeln(n); })(i); ``` Because D hasn't fixed their million dollar mistake after so many years: https://issues.dlang.org/show_bug.cgi?id=2043 https://issues.dlang.org/show_bug.cgi?id=23136
Jun 14 2022
parent =?UTF-8?Q?Ali_=c3=87ehreli?= <acehreli yahoo.com> writes:
On 6/14/22 02:04, bauss wrote:

 You have to do it like this:

 ```
 dgs ~= ( (n) => () { writeln(n); })(i);
 ```
The same thing with a named function as well as with iota(): import std.range; import std.algorithm; import std.stdio; void main() { void delegate()[] dgs; auto makeDg(int i) { return () => writeln(i); } foreach (immutable i; 0 .. 3) { dgs ~= makeDg(i); } iota(3).each!(i => dgs ~= () => writeln(i)); foreach (dg; dgs) { dg(); } } Ali
Jun 14 2022