2016-04-11 4 views
6

हाल के साक्षात्कार के दौरान मेरे पास काफी प्रतिष्ठित सॉफ्टवेयर कंपनी थी, मैं एक मामूली मामूली स्कैला प्रश्न के लिए एक वैध स्पष्टीकरण प्रदान करने की कोशिश कर रहा था। पर विचार करें निम्नलिखित:एक वैरिएबल असाइनमेंट का क्या होता है जब मैं एक विधि को कॉल करता हूं जो कहा गया वैरिएबल वाले केस क्लास का उदाहरण देता है?

Person(10) 

सवाल क्यों है जाता है और जब मैं 3person.age को असाइन क्या हो रहा है:

case class Person(var age: Int) 
def person = new Person(10) 
person.age = 3 
println(person) 

यह है println बयान से क्या दिया जाता है?

+1

शायद सबसे अच्छा जवाब था: "बस एक केस क्लास में वर्र्स का उपयोग न करें"। –

उत्तर

7

खैर,

def person = new Person(10) 

एक समारोह है। यही है, हर बार जब आप person पर कॉल करते हैं, तो आप Person का एक नया उदाहरण बनाते हैं। इस प्रकार, यदि हम समारोह इनलाइन, अपने कोड देखने की तरह होगा:

Person(10).age = 3 
println(Person(10)) 

आप व्यक्ति उदाहरण आप पहली बार बनाया वर्ष की आयु में परिवर्तन करना चाहते हैं, तो आप कि उदाहरण के कब्जा करने के लिए की जरूरत है।

val p = person 
p.age = 3 
println(p) 
8

इसके लिए आपको val और def के बीच अंतर को समझना होगा।

जब आप किसी भी अभिव्यक्ति के लिए def का उपयोग करते हैं, तो इसका हर बार मूल्यांकन किया जाता है। इसलिए, इस मामले में जब आप person.age = 3 करते हैं तो यह व्यक्ति ऑब्जेक्ट का एक नया उदाहरण बनाएगा और उसकी उम्र के लिए 3 असाइन करेगा, और जब आप println(person) करते हैं तो यह फिर से एक नई व्यक्ति वर्ग को तुरंत चालू करेगा और इसलिए यह Person(10) प्रिंट करता है।

तो, आप val बजाय def इस तरह है: val person = new Person(10) और कर

person.age = 3 
println(person) 

उत्पादन होगा: Person(3) क्योंकि, val एक बार मूल्यांकन किया जाता है। इसलिए, इस मामले में person का केवल एक उदाहरण होगा इससे कोई फर्क नहीं पड़ता कि आप person का उपयोग कैसे कर सकते हैं।

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