لماذا لا يعمل رمز "الربط" هذا كما هو متوقع في 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

من الواضح أن زيادة العداد في الحلقة لا يتم التعامل معها على أنها تغيير في القيمة ولا يتم تقييم التعبير المرتبط.

هل يمكن لأي شخص أن يشرح المفهوم وراء هذا السلوك؟

هل كانت مفيدة؟

المحلول

ال إلى عن على يعرّف التعبير ضمنيًا متغير التكرار (لهذا السبب لم تكن بحاجة إلى الإعلان أنا في مثالك الثاني). حتى لو كان هناك بالفعل متغير مع نفس الاسم ، إلى عن على سيظل إنشاء واحد جديد لنطاقه. لك ربط التعبير مرتبط بـ 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 خارج إلى عن على لن تتغير الحلقة إذا قمت بتعديل متغير يحمل نفس الاسم داخل إلى عن على عقدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top