Delegates and values captured inside loops

monkyyy crazymonkyyy at gmail.com
Sat Jan 20 16:21:52 UTC 2024


On Saturday, 20 January 2024 at 15:59:59 UTC, Anonymouse wrote:
> I remember reading this was an issue and now I ran into it 
> myself.
>
> ```d
> import std.stdio;
>
> void main()
> {
>     auto names = [ "foo", "bar", "baz" ];
>     void delegate()[] dgs;
>
>     foreach (name; names)
>     {
>         dgs ~= () => writeln(name);
>     }
>
>     foreach (dg; dgs)
>     {
>         dg();
>     }
> }
> ```
>
> Expected output: `foo`, `bar`, `baz`
> Actual output:   `baz`, `baz`, `baz`
>
> If I make `names` an `AliasSeq` it works, but I need it to be a 
> runtime array.
>
> Is there a workaround?

Everything is sucks, if your throwing out compile time functions 
rewriting it as a struct (or generating a struct) is probaly you 
best bet

```d
struct dg{
   string s;
   void opApply(){
     s.writeln;
   }
}
```


More information about the Digitalmars-d-learn mailing list