What is the correct way of making this output 0 1 2
?
void delegate()[] dgs;
foreach (immutable i; 0..3)
{
dgs ~= () => writeln(i);
}
foreach (dg; dgs)
{
dg(); // outputs: `2 2 2`
}
Thread overview | |||||
---|---|---|---|---|---|
|
June 14, 2022 Closures over temporary variables | ||||
---|---|---|---|---|
| ||||
What is the correct way of making this output
|
June 14, 2022 Re: Closures over temporary variables | ||||
---|---|---|---|---|
| ||||
Posted in reply to Anonymouse | On Tuesday, 14 June 2022 at 08:26:53 UTC, Anonymouse wrote: >What is the correct way of making this output
You have to do it like this:
Because D hasn't fixed their million dollar mistake after so many years: |
June 14, 2022 Re: Closures over temporary variables | ||||
---|---|---|---|---|
| ||||
Posted in reply to bauss | 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 |