Почему этот «связывающий» код не работает должным образом в JavaFX? - PullRequest
5 голосов
/ 18 марта 2009

Я новичок в 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

Очевидно, что приращение счетчика в цикле не обрабатывается как изменение значения, и связанное выражение не переоценивается.

Кто-нибудь может объяснить, пожалуйста, концепцию этого поведения?

1 Ответ

6 голосов
/ 18 марта 2009

Выражение для неявно определяет его итерационную переменную (поэтому вам не нужно объявлять i во втором примере). Даже если переменная с таким именем уже существует, для все равно создаст новую для своей области видимости. Ваше выражение bind привязано к переменной curr вне вашей петли для , а не к той, которая находится внутри вашей петли для . И тот, что находится вне вашего цикла, не изменяется, поэтому связанное выражение не изменится.

Пример, демонстрирующий это поведение для :

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...