¿Por qué esto no & # 8220; vinculante & # 8221; Cómo funciona el código como se esperaba en JavaFX?
-
19-08-2019 - |
Pregunta
Soy nuevo en JavaFX. No puedo entender por qué el siguiente código no funciona.
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 obteniendo
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 a
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}");
}
Obtengo el resultado correcto:
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
Claramente, el incremento del contador en el ciclo no se trata como un cambio de valor y la expresión enlazada no se vuelve a evaluar.
¿Alguien puede explicar el concepto detrás de este comportamiento?
Solución
La expresión for define implícitamente su variable de iteración (es por eso que no necesita declarar i en su segundo ejemplo). Incluso si ya hay una variable con el mismo nombre, para seguirá creando una nueva para su alcance. Su expresión bind está vinculada a la variable curr fuera de su bucle for , no a la que está dentro de su for lazo. 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
Por lo tanto, el curr fuera del bucle for no cambiará si modifica una variable del mismo nombre dentro del bucle for .