Почему этот “привязывающий” код не работает так, как ожидалось в JavaFX?
-
19-08-2019 - |
Вопрос
Я новичок в 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}");
}
Я получаю
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
Если я изменю код на
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}");
}
Я получаю правильный результат:
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
Очевидно, что увеличение счетчика в цикле не обрабатывается как изменение значения, и связанное выражение не вычисляется повторно.
Кто-нибудь может, пожалуйста, объяснить концепцию, лежащую в основе такого поведения?
Решение
В для выражение неявно определяет свою переменную итерации (вот почему вам не нужно было объявлять i в вашем втором примере).Даже если уже существует переменная с таким же именем, для все равно будет создан новый для его области применения.Ваш привязать выражение привязано к курр переменная за пределами вашего для цикл, а не к тому, который находится внутри вашего для петля.И тот, который находится за пределами вашего цикла, не меняется, поэтому связанное выражение не изменится.
Пример, демонстрирующий такое поведение для:
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}");
Это выведет:
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
Таким образом, курр за пределами для цикл не изменится, если вы измените переменную с тем же именем внутри для петля.