2009-03-18 23 views
5

मैं जावाएफएक्स में नया हूं। मैं समझ नहीं पा रहा हूं कि नीचे दिया गया कोड क्यों काम नहीं करता है।जावाफ़ैक्स में अपेक्षित "बाध्यकारी" कोड क्यों काम नहीं करता है?

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 

जाहिर है, में काउंटर वेतन वृद्धि लूप को मूल्य परिवर्तन के रूप में नहीं माना जाता है और बी आउंड अभिव्यक्ति का मूल्यांकन नहीं किया जाता है।

क्या कोई इस व्यवहार के पीछे अवधारणा को समझा सकता है?

उत्तर

6

के लिए अभिव्यक्ति परोक्ष अपनी यात्रा चर को परिभाषित करता है (यही कारण है कि आप अपने दूसरे उदाहरण में मैं घोषित करने के लिए जरूरत नहीं थी है)। यहां तक ​​कि यदि पहले से ही एक ही नाम के साथ एक चर है, के लिए अभी भी इसके दायरे के लिए एक नया बना देगा। आपका बाँध अभिव्यक्ति अपने के लिए पाश अंदर एक के लिए नहीं, पाश के लिए अपने की 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 पाश के लिए बाहर परिवर्तन नहीं होगा यदि आप संशोधित के अंदर लूप के लिए एक ही नाम का एक चर।

+0

धन्यवाद टिम। बहुत अच्छी व्याख्या। – Rahul

संबंधित मुद्दे