2011-12-09 17 views
5

के साथ उपयोग किया जाता है तो मैं स्कैला के लिए बिल्कुल नया हूं। मैं समझने की कोशिश कर रहा हूं कि कैसे/अगर एक अभिनेता को संदेश के हिस्से के रूप में बंद होने पर स्कैला गतिशील बाध्यकारी करता है।स्केल परिवर्तनीय बाध्यकारी जब अभिनेता

मैं स्कैला 2.9 के साथ अक्का 1.2 का उपयोग कर रहा हूं।

मैं निम्नलिखित कोड खंड (http://gleichmann.wordpress.com/2010/11/15/functional-scala-closures/ से संशोधित)

var minAge = 18 
val isAdult = (age: Int) => age >= minAge 

actor ! answer(19, isAdult) 
minAge = 20 
actor ! answer(19, isAdult) 

अभिनेता तरफ है, यह केवल पहले पैरामीटर के लिए isAdult लागू होता है और परिणाम प्रिंट करता है। स्काला के बाद से उपयोग करता है गतिशील बंधन (ताकि मुझे बताया गया था), मैं

true 
false 

अपेक्षा की होगी लेकिन किसी भी तरह परिणाम

false 
false 

है तो यह सच है कि स्केला चर स्थिर बंधन और 18 ले जा रहा है है दोनों उत्तर संदेशों के लिए minAge के मूल्य के रूप में? संदेश में बंद करने के दौरान गतिशील बाध्यकारी व्यवहार रखने का कोई तरीका है?

धन्यवाद!

उत्तर

9

बंद होने की आपकी समझ सही है। यह गतिशील बाध्यकारी कर रहा है हालांकि आप समेकन मुद्दों को पेश कर रहे हैं। बंद करने योग्य डेटा को बाध्यकारी है जो बंद करने योग्य को बंद कर देता है। जब आप अभिनेताओं के बीच कड़ाई से अपरिवर्तनीय डेटा पास करते हैं तो अभिनेता मॉडल केवल समवर्ती मुद्दों को हल करता है। आप इसे एक क्रमिक कालक्रम में लिख सकते हैं लेकिन अभिनेता शेड्यूलर घटनाओं के क्रम को बदलता है। और चूंकि आडल्ट उत्परिवर्तनीय है, फिर से परिणामस्वरूप परिणाम बदलते हैं।

actor ! answer(19, isAdult) // message put in actor queue 
minAge = 20 
actor ! answer(19, isAdult) // message put in actor queue 
// later... 
// actor handles answer(19, isAdult) 
// actor handles answer(19, isAdult) 
+0

धन्यवाद! यह समझ में आता है। तो आडल्ट का आलसी मूल्यांकन किया गया है और जब तक अभिनेता वास्तव में संदेश को संभाल नहीं लेता तब तक वेरिएबल्स कभी बंधे नहीं होते हैं .. ऐसा लगता है कि अगर मैंने minAge = 20 चलाने से पहले अपनी पहली क्वेरी से उत्तर देने का इंतजार किया था, तो मुझे परिणाम मिलने की उम्मीद है। – royalflush

+2

यह सही है, लेकिन कृपया इसे कभी याद न करें ;-) गंभीरता से, यदि आप उनके बीच परिवर्तनीय स्थिति साझा करना चाहते हैं तो आप अभिनेताओं का उपयोग नहीं करेंगे। दुर्भाग्यवश, स्कैला "बाय-वैल्यू" को बंद करने का कोई तरीका नहीं प्रदान करती है, इसलिए केवल एक चीज जो आप कर सकते हैं वह मैन्युअल रूप से सुनिश्चित करता है कि आपके द्वारा बंद की गई हर चीज़ 'वैल' है। –

+0

मुझे लगता है कि तर्क एक मशीन मामले पर सच है। लेकिन रिमोट अभिनेताओं के साथ, क्यों नहीं? उदाहरण के लिए मैं दो कलाकारों के बीच वितरित स्थिति को सिंक्रनाइज़ करने के लिए एक संदेश भेज सकता हूं? – royalflush

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