delegates with references to local strings

Artur Skawina art.08.09 at gmail.com
Sat Jun 2 08:38:45 PDT 2012


On 06/02/12 14:01, Tobias Pankrath wrote:
> consider this:
> 
> 
> ------------
> import std.stdio;
> import std.string;
> 
> alias void delegate() dlgt;
> 
> int main()
> {
>         dlgt[] dgs;
>         string[] lines = ["line A", "line B", "line C"];
>         foreach(line; lines)
>         {
>                 writeln(line);
>                 dgs ~=  { writeln(line); };
>         }
> 
>         foreach(dg; dgs) { dg(); }
>         return 0;
> }
> 
> -----------
> 
> It prints every line in line and stores a delegate that does the same.
> The output is:
> 
> line A
> line B
> line C
> line C
> line C
> line C
> 
> I want it to print every line twice. How can I store the string of the current iteration with a delegate? I tried dup'ing into a local, which didn't help.

   dgs ~= (string l) { return { writeln(l); }; }(line);

This isn't really much different from http://d.puremagic.com/issues/show_bug.cgi?id=2043
but I'm not convinced the compiler should be cloning the variables here (ie if that "bug"
really is a bug); it certainly can be surprising though.

artur


More information about the Digitalmars-d-learn mailing list