2014-06-30 7 views
7

स्केला स्रोत में मैंने पाया है के रूप में परिभाषित किया गया है?क्यों `` Nil` मामले object`

मैंने पाया इस सवाल [Difference between case object and object] उपयोगी है, और मुझे लगता है कि इस कारण से कुंजी है:

डिफ़ॉल्ट क्रमबद्धता

की वजह से हम अक्सर एक और अभिनेता के लिए डेटा की सूची भेजने के कार्यान्वयन, तो नील serializable होना चाहिए, है ना?


प्रदान की जवाब (धन्यवाद) के साथ, मैं यह सत्यापित करने के लिए कुछ कोड लिखने की कोशिश:

trait MyList[+T] 

object MyNil extends MyList[Nothing] 

val list: MyList[String] = MyNil 

list match { 
    case MyNil => println("### is nil") 
    case _ => println("### other list") 
} 

आप देख सकते हैं MyNilcase object नहीं है, लेकिन मैं अभी भी पैटर्न मिलान में इसका इस्तेमाल कर सकते हैं। यहां आउटपुट है:

### is nil 

क्या मैं कुछ गलत समझता हूं?

उत्तर

2

कि जुड़ा हुआ सवाल की टिप्पणियों में उल्लेख किया है, एक बात आप प्राप्त एक खूबसूरत .toString परिणाम

scala> MyNil.toString 
res0: String = [email protected] 

scala> case object MyNil2 extends MyList[Nothing] 
defined module MyNil2 

scala> MyNil2.toString 
res2: String = MyNil2 

scala> Nil.toString 
res1: String = List() 
5

अपरिवर्तनीय डेटा के लिए सामान्य तौर पर, सवाल कभी नहीं होना चाहिए कि "क्यों इस एक मामले वस्तु है (या कक्षा) "लेकिन" क्या मैं इसे एक मामला वस्तु बना सकता हूं? "। कुछ छोटे अपवादों (ज्यादातर विरासत के कारण) के साथ, स्कैला में डेटा तत्व अपरिवर्तनीय होना चाहिए, और केस कक्षाओं/वस्तुओं के माध्यम से लागू किया जाना चाहिए। यह देखते हुए कि, केस ऑब्जेक्ट और केस क्लास (क्रमशः) के रूप में नील और :: को लागू करना केवल मानक अभ्यास है, जिसके लिए कोई नकारात्मकता नहीं है।

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