Hi,
I'm still having hard time using closures in Vala.
If I understand it well, the following code should return two
lambda-expressions referencing the same variable ("Pair" is just a
container - as an attachment, I join the full code):
Pair builder(int v) {
return new Pair(
() => { return ++v; },
() => { return --v; }
);
}
Here is how I use the function above:
void main() {
Pair p1 = builder(10);
Pair p2 = builder(100);
stdout.printf("%d %d %d\n", p1.fa(), p1.fa(), p1.fb());
stdout.printf("%d %d %d\n", p2.fa(), p2.fa(), p2.fb());
}
There is no error on compilation. But the result is quite surprising:
sh$ valac closure.vala
sh$ ./closure
1 2 1
1 2 1
It appears that each time "builder" is called, both returned
lambda-expressions are referencing the same variable. Which is a
different one for each call to "builder". That was expected.
But, for some reason, those variables are initialized to 0 instead of
the value passed as an argument.
I don't know if this is a good comparison, but I tried what I think is
the same code in JavaScript (using Mozilla Rhino). This is a language
that has closure too, and that gives me the result I was expecting:
sh$ rhino closure.js
11 12 11
101 102 101
Anyway, I think I missed an important point regarding how closures work
in Vala. So, I would be very glad if someone could bring me to some
explanations!
Thanks in advance,
- Sylvain
--
Sylvain Leroux <sylvain chicoree fr>
http://www.chicoree.fr
Attachment:
closure.vala
Description: Text Data
Attachment:
closure.js.txt
Description: Text document