On 03/29/2018 05:16 PM, Ivan Kazmenko wrote:
     int delegate () [] guns;
     foreach (i; 0..2) guns ~= () => i;
     foreach (i; 0..2) writeln (guns[i] ());  // 1 and 1, why?

Because there's only variable `i`. All delegates refer to that same one. With `i` being mutable, this could maybe be argued to be acceptable.

     int delegate () [] huns;
     foreach (i; 0..2) {
         immutable int j = i;
         huns ~= () => j;
     }
     foreach (i; 0..2) writeln (huns[i] ());  // 1 and 1, why?

Same here. There's only one `j`. With immutable, this is certainly a problem. https://issues.dlang.org/show_bug.cgi?id=2043

Two possible workarounds:

    int delegate () [] iuns;
    foreach (i; 0..2) iuns ~= (j) { return () => j; } (i);
    foreach (i; 0..2) writeln (iuns[i] ());  /* 0 and 1 */

    static struct S
    {
        int i;
        int m() { return i; }
    }
    int delegate () [] juns;
    foreach (i; 0..2) juns ~= &(new S(i)).m;
    foreach (i; 0..2) writeln (juns[i] ());  /* 0 and 1 */

Reply via email to