2009-03-18 8 views
5

Soy nuevo en JavaFX. No puedo entender por qué el código siguiente no funciona.¿Por qué este código "vinculante" no funciona como se espera en 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}"); 
} 

estoy recibiendo

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 cambio el código para

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}"); 
} 

consigo la salida correcta:

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 

Es evidente que el incremento del contador en el loop no se trata como un cambio de valor y el b La expresión original no se vuelve a evaluar.

¿Alguien puede explicar el concepto detrás de este comportamiento?

Respuesta

6

El de expresión define implícitamente su variable de iteración (por eso no era necesario declarar i en su segundo ejemplo). Incluso si ya hay una variable con el mismo nombre, para creará una nueva para su alcance. Su unen expresión está ligada a la curr fuera de su variable de de bucle, no a la una dentro de su bucle de . Y el que está fuera de su ciclo no cambia, por lo que la expresión enlazada no cambiará.

ejemplo para demostrar este comportamiento de para:

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}"); 

Esto imprimirá:

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 

Así, el curr fuera del de bucle no cambiará si modifica una variable del mismo nombre dentro del para loop.

+0

Gracias Tim. Muy buena explicación. – Rahul

Cuestiones relacionadas