Re: [Vala] for loop and closure (bug or big gotcha?)



Jiří Zárevúcky píše v Pá 05. 02. 2010 v 16:08 +0100:
Fredderic Unpenstein píše v Pá 05. 02. 2010 v 23:57 +1100:
2010/1/23 Sam Liddicott <sam liddicott com>:
I used a language called charamel for controlling 3d figurs. It's closures supported
variables in 2 ways.

Like valàa reference to the instantaneous value of the variable, and fixing it's value
(making a copy) at the time the closure was made.

How WOULD you do that in present Vala...?  That seems like an awfully
obvious thing you might want to do, to be so difficult.

The only way to do it that I can think of, in the example above, would
be attach the current value of i to the button as user data.  Seems
awfully convoluted, and not always particularly practical.


It is awfully simple. You don't need Vala to do it.

void main () {
      for (int i = 0; i < 10; ++i) {
              int t = i;
              Idle.add (() => { print ("%d", t); return false; });
      }
      
      new MainLoop ().run ();
}

TADAAAAA! You have the value in that particular iteration fixed.
Does anyone need something more sophisticated? 

So, why does this work?
i is defined before the loop and destroyed after it's exited.
i is the same variable in all iterations.
t is defined inside the iteration and destroyed when the iteration ends.
t is a different variable in every iteration.

You don't need anything from Vala. The way it works is entirely logical.


A little better example:

void main () {
        MainLoop loop = new MainLoop ();
        for (int i = 0; i < 10; ++i) {
                int t = i;
                Idle.add (() => { print ("i: %d\n", i); return false; });
                Idle.add (() => { print ("t: %d\n", t); return false; });
        }
        Idle.add (() => { loop.quit(); return false; });
        loop.run ();
}


Attachment: signature.asc
Description: Toto je digitálně podepsaná část zprávy



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]