¿Por qué esto no & # 8220; vinculante & # 8221; Cómo funciona el código como se esperaba en JavaFX?

StackOverflow https://stackoverflow.com/questions/657486

  •  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?

¿Fue útil?

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top