2009-12-11 10 views
19

मान लीजिए कि मेरे पास यह है:क्या नियंत्रित करने का कोई तरीका है कि कौन सा अंतर्निहित रूपांतरण डिफ़ॉल्ट रूप से उपयोग किया जाएगा?

class String2(val x:String) { 
    def *(times:Int) : String = { 
     val builder = new StringBuilder() 
     for(i <- 0 until times) { 
      builder.append(x) 
     } 
     builder.toString() 
    } 
} 

अब अगर मैं यह निहित जोड़ता हूं:

implicit def gimmeString2(y:String) = new String2(y) 

मुझे संकलन त्रुटि मिलेगी क्योंकि स्ट्रिंगवॉपर भी इस अंतर्निहित को जोड़ता है। क्या कंपाइलर को कहने का कोई तरीका है "अन्य implicits को अनदेखा करें, इसका उपयोग करें", ताकि मुझे String2 ऑब्जेक्ट को तुरंत चालू करने और उस पर काम करने की आवश्यकता न हो?

मैं मानता हूं कि उदाहरण कोड सबसे उपयुक्त नहीं हो सकता है (इस प्रश्न के लिए), लेकिन मुझे लगता है कि यह करेगा।

+0

संभावित डुप्लिकेट: यह है http://stackoverflow.com/questions/1339148/avoiding-implicit-def-ambiguity-in-scala –

+0

मुझे नहीं लगता कि एक डुप्लिकेट उस प्रश्न के लेखक दोनों implicits रखना चाहता था। मुझे केवल एक चाहिए। – Geo

+0

एक समान है, अगर समान नहीं है, तो उपरोक्त विधि को पहले से ही RichString में उपलब्ध है। यदि आप अपनी विधि का उपयोग करना चाहते हैं, तो शायद आप सी को छिपाने के लिए आयात a.b. {c => _} तकनीक का उपयोग कर सकते हैं जहां सी अंतर्निहित विधि नाम है। –

उत्तर

29

स्कैला 2.8 ने implicits के लिए प्राथमिकता प्रणाली जोड़ा। एक उचित उपवर्ग में परिभाषित किया जा रहा के लिए एक अन्य बिंदु

जब एक अतिभारित विधि का या एक अंतर्निहित के दो विभिन्न लागू विकल्पों की तुलना करके प्रत्येक विधि अधिक विशिष्ट तर्क होने के लिए एक बिंदु हो जाता है, और यह इस SIP on the new Java arrays में विस्तार से बताया है। दूसरे पर एक वैकल्पिक "जीत" अगर यह इन दोनों की तुलना

में अंक की एक बड़ी संख्या हो जाता है यह निष्कर्ष दिया कि विकल्प समान तर्क प्रकारों, जिनमें एक उपवर्ग जीत में परिभाषित किया गया है है है। इसलिए मुझे विश्वास है कि आप implicits इस प्रकार की घोषणा कर सकता है:

trait LowPriorityImplicits { 
    //lower priority conversions 
} 

object HighPriorityImplicits extends LowPriorityImplicits { 
    //higher-order ones here 
} 
संबंधित मुद्दे

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