Perché questo non è & # 8220; rilegatura & # 8221; il codice funziona come previsto in JavaFX?
-
19-08-2019 - |
Domanda
Sono nuovo di JavaFX. Non riesco a capire perché il codice seguente non funziona.
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}");
}
Sto ricevendo
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 cambio il codice in
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}");
}
Ottengo l'output corretto:
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
Chiaramente, l'incremento del contatore nel loop non viene trattato come una variazione di valore e l'espressione associata non viene rivalutata.
Qualcuno può spiegare il concetto alla base di questo comportamento?
Soluzione
L'espressione per definisce implicitamente la sua variabile di iterazione (ecco perché non hai bisogno di dichiarare i nel tuo secondo esempio). Anche se esiste già una variabile con lo stesso nome, per ne creerà comunque una nuova per il suo ambito. La tua espressione bind è legata alla variabile curr al di fuori del tuo ciclo for , non a quello all'interno del tuo per ciclo continuo. E quello al di fuori del tuo ciclo non cambia, quindi l'espressione legata non cambierà.
Esempio per dimostrare questo comportamento di per :
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}");
Questo stamperà:
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
Quindi il curr al di fuori del ciclo for non cambierà se modifichi una variabile con lo stesso nome all'interno del ciclo for .