2015-10-20 7 views
5

स्पष्ट करें मैं स्कैला कन्स्ट्रक्टर्स द्वारा बहुत उलझन में हूं। उदाहरण के लिए, मेरे पास निम्नलिखित वर्ग हैं जो पेड़ पर जोड़े और पत्ते नोड्स जैसे ऑपरेटरों के साथ एक वृक्ष का प्रतिनिधित्व करते हैं।स्कैला कन्स्ट्रक्टर भ्रम - कृपया

abstract class Node(symbol: String) {} 

abstract class Operator(symbol: String, 
     binaryOp: (Double, Double) => Double) extends Node(symbol) { 
} 

class Add(a: Number, b: Number) extends 
     Operator("+", (a: Double, b: Double) => a+b) { 
} 

class Number(symbol: String) extends Node(symbol) { 
    val value = symbol.toDouble 
    def this(num: Double) { 
     this(num.toString) 
    } 
} 

मैं एक साइट में पढ़ा है कि क्या एक स्काला निर्माता में चला जाता है स्वचालित रूप से अपरिवर्तनीय (वैल) है, लेकिन स्टैक ओवरफ़्लो पर इस आदमी ने कहा "The input parameters for the constructor are not vals unless you say they are." तो यह है कि एक विरोधाभास है।

इसके अलावा, मुझे कुछ कारणों से रचनाकारों में "वैल" और "ओवरराइड" जोड़ने की आवश्यकता हो सकती है या नहीं? मेरा मतलब है कि मैं सबकुछ सार्वजनिक और अपरिवर्तनीय होना चाहता हूं और "+" के बराबर प्रतीक जोड़ने के लिए, अतिरिक्त कार्य के बराबर एक बाइनरी ओपी, और दो संख्या ए और बी भी है। क्या कोई व्यक्ति बता सकता है कि गैर-वर्बोज़ तरीके से स्कैला में अपेक्षित काम करने के लिए रचनाकारों को कैसे काम करना है?

addition = Add(Number(1), Number(2)) 
addition.binaryOp(addition.a.value, addition.b.value) 
+0

आरईपीएल कक्षा पैरामीटर vals कहते हैं। 'कक्षा सी (एक्स: इंट) {डीफ़ मोड (वाई: इंट): यूनिट = एक्स = वाई}' त्रुटि 'उत्पन्न करता है: वैल के लिए पुन: असाइनमेंट। – jwvh

उत्तर

6

आप लगभग देखते हैं: एक स्काला वर्ग के निर्माता के लिए हर तर्क, दूर वर्ग के निर्माण के बाद फेंक दिया जाता है, जब तक की एक विधि

मैं इस तरह कुछ करने के लिए सक्षम होना चाहते हैं वर्ग इसका उपयोग करता है। इस मामले में, इसे private[this] val बनाया गया है।

हालांकि, आप बस अपने निर्माता पैरामीटर के सामने val/var कीवर्ड जोड़ सकते हैं और यह एक सार्वजनिक val/var बनाया जाएगा:

abstract class Node(val symbol: String) {} 

आमतौर पर, यह उपवर्गों के लिए निर्माता में दोहराया नहीं है यदि क्षेत्र पहले से ही सुपर क्लास में परिभाषित किया गया है:

abstract class Operator(symbol: String, // no val here, only pass to super class 
     val binaryOp: (Double, Double) => Double) extends Node(symbol) { 
} 

class Add(val a: Number, val b: Number) extends 
    Operator("+", (a: Double, b: Double) => a+b) { 
} 

अब आप कक्षा के बाहर से खेतों तक पहुँच सकते हैं:

addition = Add(Number(1), Number(2)) 
addition.binaryOp(addition.a.value, addition.b.value) 
+4

यह उल्लेखनीय भी हो सकता है कि केस क्लास कुछ अलग हैं (पैरामीटर सार्वजनिक रूप से सार्वजनिक रूप से 'vals' हैं), क्योंकि यह भ्रम का एक और स्रोत हो सकता है। –

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