2012-02-16 12 views
6

मैं इस घोषणा के बीच उदाहरण के लिए अंतर का एक विवरण चाहते हैं:कक्षा कन्स्ट्रक्टर घोषणा ... एक ही बात घोषित करने के दो तरीके?

class Clazz(param1: String, param2: Integer) 

और यह एक:

class Clazz(param1: String)(param2: Integer) 

दूसरी घोषणा सिर्फ वस्तुओं instantiating के रास्ते को प्रभावित करेगा या कोई गहरा कारण है करता है मुझे नहीं पता

एक कारण यह है कि मैंने सोचा था के बारे में उदाहरण के लिए मानकों के कई चर लंबाई होगा:

class Clazz(param1: String*)(param2: Integer*) 

तो वहाँ किसी भी अन्य कर रहे हैं?

उत्तर

11

# 1 प्रकार अनुमान। यह बाएं से दाएं चला जाता है और प्रति पैरामीटर सूची में किया जाता है।

scala> class Foo[A](x: A, y: A => Unit) 
defined class Foo 

scala> new Foo(2, x => println(x)) 
<console>:24: error: missing parameter type 
       new Foo(2, x => println(x)) 
         ^

scala> class Foo[A](x: A)(y: A => Unit) 
defined class Foo 

scala> new Foo(2)(x => println(x)) 
res22: Foo[Int] = [email protected] 

# 2 अंतर्निहित पैरामीटर सूची।

scala> class Foo[A](x: A)(implicit ord: scala.Ordering[A]) { 
    | def compare(y: A) = ord.compare(x, y) 
    | } 
defined class Foo 

scala> new Foo(3) 
res23: Foo[Int] = [email protected] 

scala> res23 compare 7 
res24: Int = -1 

scala> new Foo(new {}) 
<console>:24: error: No implicit Ordering defined for java.lang.Object. 
       new Foo(new {}) 
      ^
3

दूसरे संस्करण में आप क्लैज के लिए एक करीबी प्राथमिक निर्माता घोषित कर रहे हैं। तो दो संस्करणों के बीच अंतर है, स्काला में curried कार्यों के बीच "सामान्य" अंतर और रूप में ही है यानी

def foo(param1: String, param2: Int) 

def foo(param1: String)(param2: Int) 

अधिकांश समय दोनों घोषणाओं दूसरे के स्थान पर इस्तेमाल किया जा सकता है, लेकिन आप अक्सर तो यह समारोह करी करने की आवश्यकता है इसे करीबी रूप में घोषित करने के लिए और अधिक समझदारी होती है। ध्यान रखें कि आप एक curried रूप में एक सामान्य समारोह या यहाँ तक कि निर्माता परिवर्तित कर सकते हैं, उदाहरण के लिए आपके द्वारा उपयोग किए curried रूप में अपनी सामान्य Clazz निर्माता परिवर्तित कर इस:

(new Clazz(_, _)).curried 

आप एक से अधिक पैरामीटर सूचियों की जरूरत है अगर आप एक अंतर्निहित गुजर रहे हैं मान (जैसा कि कीवर्ड निहित पूर्ण पैरामीटर सूची पर लागू होता है)

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