परोक्ष विधि
सबसे आम और सामान्य दृष्टिकोण implicitly method, Predef में परिभाषित उपयोग करने के लिए है का उपयोग करना:
def add[T: Numeric](x: T, y: T) = implicitly[Numeric[T]].plus(x,y)
जाहिर है, यह कुछ हद तक वर्बोज़ है और नाम दोहराने की आवश्यकता है प्रकार वर्ग के।
def add[T: Numeric](x: T, y: T) = evidence$1.plus(x,y)
ऐसा नहीं है कि आश्चर्य की बात है:
सबूत पैरामीटर (! नहीं)
एक अन्य विकल्प निहित सबूत पैरामीटर स्वचालित रूप से संकलक द्वारा उत्पन्न के नाम का उपयोग करने के लिए है संदर्भित यह तकनीक कानूनी भी है, और इसे अभ्यास में भरोसा नहीं किया जाना चाहिए क्योंकि साक्ष्य पैरामीटर का नाम बदल सकता है। एक उच्चतर तरह की
प्रसंग (शुरू context
विधि)
इसके बजाय, एक implicitly
विधि का एक तगड़ा बनाया अप संस्करण का उपयोग कर सकते हैं। ध्यान दें कि परोक्ष तरीके के रूप में
def implicitly[T](implicit e: T): T = e
इस विधि बस विधि कॉल में आसपास के दायरे से सही प्रकार की एक अंतर्निहित ऑब्जेक्ट सम्मिलित करने संकलक पर निर्भर करता है, और फिर इसे वापस आती है परिभाषित किया गया है। हम थोड़ा बेहतर कर सकते हैं:
def context[C[_], T](implicit e: C[T]) = e
यह हमें के रूप में
def add[T: Numeric](x: T, y: T) = context.plus(x,y)
context
विधि प्रकार पैरामीटर Numeric
और T
हमारे add
विधि को परिभाषित करने के दायरे पर आधारित हैं अनुमति देता है! दुर्भाग्य से, ऐसी परिस्थितियां हैं जिनमें यह context
विधि काम नहीं करेगी। जब एक प्रकार पैरामीटर में एकाधिक संदर्भ सीमाएं होती हैं या उदाहरण के लिए विभिन्न संदर्भ सीमाओं के साथ कई पैरामीटर होते हैं।हम एक से थोड़ा अधिक जटिल संस्करण के साथ बाद समस्या का समाधान कर सकते हैं:
class Context[T] { def apply[C[_]]()(implicit e: C[T]) = e }
def context[T] = new Context[T]
इस संस्करण प्रकार पैरामीटर हर बार निर्दिष्ट करने के लिए हमें आवश्यकता है, लेकिन कई प्रकार पैरामीटर संभालती है।
def add[T: Numeric](x: T, y: T) = context[T]().plus(x,y)
'संदर्भ' विधि के साथ चालाक हैक! –
लड़का, अगर मैंने सोचा कि कोई सबूत पैरामीटर के नाम पर निर्भर था जिस तरह से मैं इसे सप्ताह में एक बार बदलता हूं ... भी, तकनीक मेरे क्षेत्राधिकार में कानूनी नहीं है, लेकिन शायद कानून अलग हैं जहां आप अलग हैं जीना। – extempore
वास्तव में बहुत चालाक। – pedrofurla