Por que esse código de "ligação" não funciona como esperado no Javafx?
-
19-08-2019 - |
Pergunta
Eu sou novo no Javafx. Não consigo entender por que o código abaixo não 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}");
}
estou obtendo
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
Se eu mudar o 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}");
}
Eu recebo a saída correta:
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, o contador incremento no loop não é tratado como uma alteração de valor e a expressão ligada não é avaliada.
Alguém pode explicar o conceito por trás desse comportamento?
Solução
o por Expressão define implicitamente sua variável de iteração (é por isso que você não precisou declarar eu no seu segundo exemplo). Mesmo que já exista uma variável com o mesmo nome, por ainda criará um novo para o seu escopo. Sua ligar A expressão está ligada ao curr variável fora do seu por loop, não para aquele dentro do seu por ciclo. E o fora do seu loop não muda, portanto a expressão ligada não muda.
Exemplo para demonstrar esse comportamento de por:
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}");
Isso vai 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
Assim, o curr fora da por O loop não mudará se você modificar uma variável de mesmo nome dentro do por ciclo.