On Thursday, 30 April 2015 at 01:16:20 UTC, Freddy wrote:
I understand that
----
import std.stdio;
void main(){
int delegate() func;
foreach(i;0..10){
if(i==5){
func= () => i;
}
}
writeln(func());//9
}
----
captures the loop variable,but why does
----
import std.stdio;
void main(){
int delegate() func;
foreach(i;0..10){
auto copy=i;
if(i==5){
func= () => copy;
}
}
writeln(func());//should be 5
}
----
still print 9.
Because "copy" is still modified every time "i" is.
You can either put "copy" inside the "if":
----
import std.stdio;
void main(){
int delegate() func;
foreach(i;0..10){
if(i==5){
auto copy=i;
func= () => copy;
}
}
writeln(func());//should be 5
}
----
Or you can create a closure for each iteration:
----
import std.stdio;
void main(){
int delegate() func;
foreach(i;0..10){
(){
auto copy=i;
if(i==5){
func= () => copy;
}
}();
}
writeln(func());//should be 5
}
----