2009-03-18 16 views
5

Sono nuovo di JavaFX. Non sono in grado di capire perché il codice qui sotto non funziona.Perché questo codice "vincolante" non funziona come previsto in JavaFX?

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 ottenendo

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 per

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}"); 
} 

ho l'uscita corretta:

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 contatore nel il ciclo non viene considerato come un cambio di valore e il b l'espressione ound non viene valutata nuovamente.

Qualcuno può spiegare il concetto alla base di questo comportamento?

risposta

6

Il per espressione definisce implicitamente la sua variabile di iterazione (è per questo che non hai bisogno di dichiarare i nel secondo esempio). Anche se esiste già una variabile con lo stesso nome, per ne creerà ancora una nuova per il suo ambito. Il tuo legano espressione è legata alla variabile curr al di fuori della vostra per ciclo, non quello all'interno del vostro per ciclo. E quello esterno al tuo loop 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 

Così il curr fuori del per ciclo non cambia se si modifica una variabile con lo stesso nome all'interno del ciclo per.

+0

Grazie Tim. Spiegazione molto bella – Rahul

Problemi correlati