2010-07-08 10 views
18
scala> class A(implicit a: Int); 
defined class A 

scala> class B()(implicit a: Int); 
defined class B 

scala> new A()(1) 
res1: A = [email protected] 

scala> new B()(1) 
res2: B = [email protected] 

scala> new A(1) 
<console>:7: error: too many arguments for constructor A:()(implicit a: Int)A 
     new A(1) 

स्कालैक कक्षा घोषणा में प्रदान की गई निहित पैरामीटर सूची से पहले एक खाली पैरामीटर सूची क्यों डालें?कक्षा की पहली पैरामीटर सूची क्यों लागू नहीं हो सकती है?

यह एक सुविधा है, नहीं एक बग हो रहा है commentary in the scalac sources द्वारा पहचानने:

// परिवर्तित (अंतर्निहित ...) करने के लिए() (निहित ...) अगर अपने ही पैरामीटर अनुभाग

मुझे यह जानकर उत्सुकता है कि यह क्यों किया जाता है। मुझे यह आश्चर्यजनक लगता है।

उत्तर

7

जिस तरह से मैं इसे देखता हूं वह यह है कि निहित पैरामीटर सूची नियमित रूप से प्रतिस्थापित नहीं होती है। चूंकि कन्स्ट्रक्टर परिभाषाओं के लिए कम से कम एक पैरामीटर सूची की आवश्यकता होती है, अगर कुछ भी संकेत नहीं दिया गया है तो स्पष्ट रूप से '()' उत्पन्न होता है।

हालांकि यह वास्तव में परेशान हो सकता है, यह एक खाली कन्स्ट्रक्टर उत्पन्न करने के अनुरूप है जब कोई पैरामीटर सूचियां मौजूद नहीं हैं।

5

ठीक है, @ venechka के answer की मदद से, मुझे लगता है कि मैंने इसे समझ लिया है।

साधारण वर्गों के साथ, स्काला infers और खाली पैरामीटर सूची, या तो वर्ग घोषणा (class B) पर, या वर्ग इन्स्टेन्शियशन (new A और new B) के बिंदु पर:

scala> class A() 
defined class A 

scala> new A 
res19: A = [email protected] 

scala> new A() 
res20: A = [email protected] 

scala> class B 
defined class B 

scala> new B 
res21: B = [email protected] 

scala> new B() 
res22: B = [email protected] 

तो ध्यान में रखते हुए होने के लिए यह सिद्धांत, यह एक निहित पैरामीटर सूची (class D(implicit ...)) से पहले एक खाली पैरामीटर सूची का अनुमान लगाता है।

scala> class C()(implicit a: Int = 0) 
defined class C 

scala> new C 
res23: C = [email protected] 

scala> new C() 
res24: C = [email protected] 

scala> new C()(0) 
res25: C = [email protected] 

scala> class D(implicit a: Int = 0) 
defined class D 

scala> new D 
res26: D = [email protected] 

scala> new D() 
res27: D = [email protected] 

scala> new D()(0) 
res28: D = [email protected] 
संबंधित मुद्दे

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