Pourquoi cette action & # 8220; contraignante & # 8221; le code fonctionne-t-il comme prévu dans JavaFX?

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

  •  19-08-2019
  •  | 
  •  

Question

Je suis nouveau sur JavaFX. Je ne comprends pas pourquoi le code ci-dessous ne fonctionne pas.

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

Je reçois

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 je change le code en

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

Je reçois le bon résultat:

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

De toute évidence, l'incrément de compteur dans la boucle n'est pas traité comme un changement de valeur et l'expression liée n'est pas réévaluée.

Quelqu'un peut-il expliquer le concept de ce comportement?

Était-ce utile?

La solution

L'expression for définit implicitement sa variable d'itération (c'est pourquoi vous n'avez pas besoin de déclarer i dans votre deuxième exemple). Même s'il existe déjà une variable portant le même nom, pour en créera quand même une nouvelle pour son étendue. Votre expression bind est liée à la variable curr située en dehors de votre boucle for , et non à celle située à l'intérieur de votre for . boucle. Et celle en dehors de votre boucle ne change pas, donc l'expression liée ne changera pas.

Exemple pour illustrer ce comportement de pour :

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

Ceci imprimera:

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

Ainsi, curr à l'extérieur de la boucle for ne changera pas si vous modifiez une variable du même nom à l'intérieur de la boucle for .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top