2015-10-24 9 views
17

मैंने implicit को स्काला में टाइपक्लास पैटर्न के लिए दो तरीकों (एक से कम) देखा है।स्कैला अंतर्निहित वस्तु बनाम अंतर्निहित मूल्य

implicit val instance1 = new Typeclass { def do = ??? } 
implicit object instance2 extends Typeclass { def do = ??? } 

वे अलग कैसे हैं? क्या किसी को निश्चित समय के लिए एक दूसरे को पसंद करना चाहिए? मुझे implicit valimplicit object से अधिक सामान्य रूप से उपयोग किया जाता है और मुझे अभी तक implicit object के बारे में कई संसाधन नहीं मिल पाए हैं।

उत्तर

8

एक अंतर यह है कि object संस्करण आलसी प्रारंभिक होने जा रहा है, यानी यह कन्स्ट्रक्टर को पहली बार उपयोग नहीं किया जाएगा जब तक इसे इस्तेमाल नहीं किया जाएगा।

trait Incrementer[T] { 
    def inc(x: T) 
} 

def increment[T](x: T)(implicit ev: Incrementer[T]) = ev.inc(x) 

implicit object IntIncrementer extends Incrementer[Int] { 
    println("IntIncrementer is being constructed...") 

    def inc(x: Int) = x + 1 
} 

implicit val DoubleIncrementer extends Incrementer[Double] { 
    println("DoubleIncrementer is being constructed...") 

    def inc(x: Double) = x + 1D 
} 

ध्यान दें कि आप IntIncrementer से संदेश दिखाई नहीं देगा जब तक यह प्रयोग किया जाता है, उदाहरण के लिए: उदाहरण के लिए

increment(1) //this prints "IntIncrementer is being constructed..." 

DoubleIncrementer से संदेश, फिर भी, जब यह परिभाषित किया गया है प्रदर्शित किया जाएगा। तो implicit object का प्रारंभिक आलसी है जबकि implicit val की शुरुआत सख्त है।

+1

तो, 'वाल्फी' बनाम 'ऑब्जेक्ट' 'ऑब्जेक्ट' का उपयोग करने का निर्णय आलसी या सख्त प्रारंभिकता को पसंद करना है या नहीं? –

+2

यह एक विचार हो सकता है (हालांकि आप हमेशा 'वैल' के साथ आलस्य पाने के लिए 'आलसी मूल्य' का उपयोग कर सकते हैं), लेकिन केवल एक ही नहीं। उदाहरण के लिए, एक 'वाल' सदस्य को सबक्लास में ओवरराइड किया जा सकता है जबकि 'ऑब्जेक्ट' सदस्य नहीं कर सकता है। मुझे यकीन है कि बहुत सारे अंतर हैं। –

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