2009-03-18 9 views
5

Je suis nouveau à JavaFX. Je ne suis pas capable de comprendre pourquoi le code ci-dessous ne fonctionne pas.Pourquoi ce code "binding" ne fonctionne-t-il pas comme prévu dans JavaFX?

import javafx.util.Sequences; 

def nums = [1..10]; 
var curr = 0; 

var evenOrOdd = bind if (nums[curr] mod 2 == 0) "{nums[curr]} is an even number" else "{nums[curr]} is an odd number"; 

for (curr in [0..(sizeof nums -1)]) 
{ 
    println("{evenOrOdd}"); 
} 

Je reçois

1 is an odd number 
1 is an odd number 
1 is an odd number 
1 is an odd number 
1 is an odd number 
1 is an odd number 
1 is an odd number 
1 is an odd number 
1 is an odd number 
1 is an odd number 

Si je change le code pour

import javafx.util.Sequences; 

def nums = [1..10]; 
var curr = 0; 

var evenOrOdd = bind if (nums[curr] mod 2 == 0) "{nums[curr]} is an even number" else "{nums[curr]} is an odd number"; 

for (i in [0..(sizeof nums -1)]) 
{ 
    curr = i; 
    println("{evenOrOdd}"); 
} 

Je reçois la sortie correcte:

1 is an odd number 
2 is an even number 
3 is an odd number 
4 is an even number 
5 is an odd number 
6 is an even number 
7 is an odd number 
8 is an even number 
9 is an odd number 
10 is an even number 

De toute évidence, l'incrément de compteur dans le boucle n'est pas traitée comme un changement de valeur et le b L'expression ound n'est pas réévaluée.

Quelqu'un peut-il s'il vous plaît expliquer le concept derrière ce comportement?

Répondre

6

Le pour expression définit implicitement sa variable d'itération (c'est pourquoi vous ne l'avez pas besoin de déclarer i dans votre deuxième exemple). Même s'il existe déjà une variable avec le même nom, pour en créera toujours une nouvelle pour sa portée. Votre bind expression est liée à la Curr variable en dehors de votre boucle, pas celui à l'intérieur de votre boucle. Et celui en dehors de votre boucle ne change pas, donc l'expression liée ne changera pas.

exemple pour démontrer ce comportement de pour:

var curr = 0; 
var ousideCurrRef = bind curr; 
println("Before 'for' loop: curr={curr}"); 
for (curr in [0..3]) 
{ 
    println("In 'for' loop: curr={curr} ousideCurrRef={ousideCurrRef}"); 
} 
println("After 'for' loop: curr={curr}"); 

Ce imprimera:

Before 'for' loop: curr=0 
In 'for' loop: curr=0 ousideCurrRef=0 
In 'for' loop: curr=1 ousideCurrRef=0 
In 'for' loop: curr=2 ousideCurrRef=0 
In 'for' loop: curr=3 ousideCurrRef=0 
After 'for' loop: curr=0 

Ainsi, le Curr en dehors de la boucle ne changera pas si vous modifiez une variable du même nom à l'intérieur de la boucle pour.

+0

Merci Tim. Très belle explication. – Rahul

Questions connexes