2012-03-25 11 views
33

देखो:मैं सार्वजनिक सदस्यों के रूप में स्कैला कन्स्ट्रक्टर तर्कों का खुलासा कैसे करूं? इस उदाहरण को

class Point(x: Double, y: Double){ 
    override def toString = "x: " + x + ", y: " + y 
    def +(sourcePoint: Point) : Point = { 
    return new Point(x + sourcePoint.x, y + sourcePoint.y 
    } 
} 

आप देख सकते हैं मैं प्वाइंट वर्ग पर एक + ऑपरेटर विधि को परिभाषित करना चाहते। लेकिन इस काम नहीं करेगा क्योंकि उस विधि में, x और ysourcePoint स्थानीय चर पर पहुँचा नहीं जा सकता क्योंकि वे निजी हैं, इसलिए मैं इस में उदाहरण बदल दिया है:

class Point(_x: Double, _y: Double){ 
    var x = _x 
    var y = _y 

    override def toString = "x: " + x + ", y: " + y 
    def +(sourcePoint: Point) : Point = { 
    return new Point(x + sourcePoint.x, y + sourcePoint.y) 
    } 
} 

कि स्पष्ट रूप से काम किया है, तथापि _x -> x और _y -> y से जाने के बजाय इन चर को परिभाषित करने का एक आसान तरीका है।

मदद और समय के लिए धन्यवाद! :)

+5

जब आप 'क्लास प्वाइंट (एक्स: डबल, वाई: डबल)', 'x' और' y' लिखते हैं तो प्राथमिक कन्स्ट्रक्टर के लिए पैरामीटर हैं, कक्षा में फिल्में नहीं। उन्हें कक्षा के क्षेत्र बनाने के लिए, आपको 'val' या' var' की आवश्यकता है। – markmarch

+0

आठ, धन्यवाद! अब स्पष्ट लगता है;) – user1285925

+1

यह थोड़ा ओटी है, लेकिन अपनी '+' विधि में स्पष्ट वापसी का उपयोग न करें, स्कैला में स्पष्ट रिटर्न को अपवादित किया गया है और सीधे कैच किया गया है और फिर परिणाम लौटाया गया है। बंद करने से बाहर निकलने के लिए केवल इसका इस्तेमाल करें। – drexin

उत्तर

58

हाँ, वहाँ है:

class Point(val x: Int, val y: Int) 
+1

मुझे शर्मिंदा लगता है। मुझे अपना होमवर्क बेहतर तरीके से करना चाहिए: मैं इसे कैसे छोड़ सकता हूं: पी – user1285925

+0

@ user1285925 यदि आप 'x' और' y' निजी रखना चाहते हैं तो उन्हें कन्स्ट्रक्टर तर्क सूची में प्रत्येक 'val' से पहले 'निजी' जोड़ना होगा। –

+0

@LeifWickland क्या तर्क सूची में 'निजी मूल्य' घोषित करने का कोई कारण है? आप इसे छोड़ सकते हैं और यदि आवश्यक हो तो कंपाइलर इसे फ़ील्ड बनाता है। –

3

का उपयोग कर val मान्य है, लेकिन उसके बाद पैरामीटर अंतिम (स्थिर) हो जाता है। यदि आप मान को पुन: असाइन करने में सक्षम होना चाहते हैं तो आपको इसके बजाय var का उपयोग करना चाहिए। तो

class Point(var x: Int, var y: Int) 
संबंधित मुद्दे

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