2012-04-06 8 views
6

स्काला प्रोग्रामर पता होना चाहिए था कि लेखन की इस तरह:प्रत्येक "सेटर" विधि को स्कैला में "गेटटर" विधि की आवश्यकता होती है?

class Person{ 
    var id = 0 
} 
var p = new Person 
p.id 
p.id = 2  

प्रभाव में

class Person{ 
private var _id = 0 
def id = _id 
def id_=(i: Int) = _id = i 
} 
val p = new Person 
p.id // be equal to invoke id method of class Person 
p.id = 2 // be equal to p.id_=(2) 

के बराबर है। लेकिन तुम गेटर विधि def id = _id टिप्पणी करता है, तो, p.id = 2 एक संकलन त्रुटि का कारण होगा, कह

error: value key is not a member of Person 

किसी को समझा सकते हैं क्यों?

+0

'व्यक्ति' की आपकी दो परिभाषा बिल्कुल समान नहीं हैं, क्योंकि दूसरा व्यक्ति '_id' के लिए निजी गेटर और सेटर विधियां भी उत्पन्न करेगा। –

उत्तर

8

संकलक ऐसा इसलिए है क्योंकि विनिर्देश ऐसा कहता है।

Scala Reference, पी देखें। 86, §6.15 असाइनमेंट्स।

नोट कुछ भी नहीं तुम से रोकता है:

  • गेटर वापसी एक और प्रकार
  • बनाने गेटर private
  • बनाने गेटर "uncallable" बनाने, उदा इस तरह: def id(implicit no: Nothing)
+0

आपका उत्तर मुझे खुश बनाता है :-) –

+0

मैं नहीं देख सकता कि स्पेटर के इस अनुभाग को सेटर के काम के लिए एक गेटर की आवश्यकता है। क्या आप (या कोई और) समझा सकते हैं? –

+1

"यदि' x' कुछ टेम्पलेट में परिभाषित पैरामीटर रहित फ़ंक्शन है, और उसी टेम्पलेट में सदस्य के रूप में एक सेटटर फ़ंक्शन 'x_ = 'होता है, तो असाइनमेंट' x = e' को '_ _ _ = (e)' उस सेटर फ़ंक्शन का। "इसके लिए 'x' को पैरामीटर रहित फ़ंक्शन होना आवश्यक है। –

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