digitalmars.D.learn - delegates with references to local strings
- Tobias Pankrath (31/31) Jun 02 2012 consider this:
- bearophile (16/18) Jun 02 2012 You need to create a closure (D main returns 0 automatically):
- Tobias Pankrath (1/1) Jun 02 2012 Thank you. That works.
- Artur Skawina (6/42) Jun 02 2012 dgs ~= (string l) { return { writeln(l); }; }(line);
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.
Thank you for your advice.
Jun 02 2012
Tobias Pankrath:How can I store the string of the current iteration with a delegate?You need to create a closure (D main returns 0 automatically): import std.stdio, std.string; void main() { auto lines = ["line A", "line B", "line C"]; void delegate()[] delegates; foreach (line; lines) { writeln(line); delegates ~= ((in string myLine) => { writeln(myLine); })(line); } foreach (deleg; delegates) deleg(); } Bye, bearophile
Jun 02 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
Jun 02 2012









"Tobias Pankrath" <tobias pankrath.net> 