Por que esse código de "ligação" não funciona como esperado no Javafx?

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

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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top