Почему этот “привязывающий” код не работает так, как ожидалось в JavaFX?

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

  •  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

Таким образом, курр за пределами для цикл не изменится, если вы измените переменную с тем же именем внутри для петля.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top