2010-04-21 15 views
6

मैं स्कैला 2.7 से स्विच कर रहा हूं और स्केल 2.8 का ऑर्डर कर रहा हूं और ऑर्डरिंग का उपयोग कर रहा हूं। यह काफी सीधे आगे दिखता है लेकिन मैं सोच रहा था कि क्या मैं इसे थोड़ा कम वर्बोज़ बना सकता हूं। उदाहरण के लिए:स्कैला 2.8 ट्रीमैप और कस्टम ऑर्डरिंग

scala> case class A(i: Int) 
defined class A 
scala> object A extends Ordering[A] { def compare(o1: A, o2: A) = o1.i - o2.i} 
defined module A 

मैं तो एक ट्री-मैप बनाने का प्रयास करें, तो अगर मैं स्पष्ट रूप से इसे का आदेश देने ठीक काम करता है के रूप में वस्तु एक निर्दिष्ट मैं कोई त्रुटि मिलती है

scala> new collection.immutable.TreeMap[A, String]() 
<console>:10: error: could not find implicit value for parameter ordering: Ordering[A] 
     new collection.immutable.TreeMap[A, String]() 
    ^

हालांकि।

scala> new collection.immutable.TreeMap[A, String]()(A) 
res34: scala.collection.immutable.TreeMap[A,String] = Map() 

क्या मुझे हमेशा ऑर्डरिंग स्पष्ट रूप से निर्दिष्ट करना है या क्या कोई छोटा प्रारूप है?

धन्यवाद

+1

चेतावनी: इन्हें घटाकर इनट की तुलना करना काम नहीं करता है। यहां दिए गए अधिकांश उत्तरों पर भी लागू होता है। http://stackoverflow.com/questions/2728793/java-integer-what-is-faster-comparison-or-subtraction –

+0

... * iff * ints * big * हैं और विपरीत संकेत हैं। साइन स्विच के बाद से संख्या विपरीत परिणाम देने के बाद ओवरफ्लो कर सकती है। लेकिन अगर आप संख्याओं * के साथ काम कर रहे हैं * * Int.MAX_VALUE' के करीब, आप पहले ही आग से खेल रहे हैं, है ना? मुझे लगता है कि "idiom" घटाना विशेष रूप से संक्षिप्त/उपयोगी है क्योंकि स्कैला में (टर्नरी) सशर्त अभिव्यक्ति नहीं है (? :) – kornfridge

उत्तर

10

सूचना शब्द "निहित" नैदानिक ​​में। पैरामीटर को implicit घोषित किया गया है जिसका अर्थ है कि कंपाइलर उस बिंदु पर उपयुक्त मान ढूंढने का प्रयास करेगा, जिस पर आप कन्स्ट्रक्टर का आह्वान करते हैं। आप अपने एक अंतर्निहित मूल्य आदेश करते हैं, तो यह संकलक द्वारा इस इलाज के लिए पात्र होगा:

scala> implicit object A extends Ordering[A] { def compare(o1: A, o2: A) = o1.i - o2.i} 
defined module A 

scala> val tm1 = new collection.immutable.TreeMap[A, String]() 
tm1: scala.collection.immutable.TreeMap[A,String] = Map() 

संपादित करें:

उदाहरण आरईपीएल में काम करता है ऐसा इसलिए है क्योंकि आरईपीएल अदृश्य वर्ग परिभाषा में अपने कोड encloses। यहाँ एक है कि नि: शुल्क से चली आ रही काम करता है:

case class A(val i:Int) extends Ordered[A] { def compare(o:A) = i - o.i } 

object A { implicit object AOrdering extends Ordering[A] { def compare(o1: A, o2: A) = o1.i - o2.i } } 

class B { 
    import A.AOrdering 

    val tm1 = new collection.immutable.TreeMap[A, String]() 
} 
+0

यदि मैं अपने कोड में कोशिश करता हूं तो मुझे "त्रुटि: 'अंतर्निहित' संशोधक का उपयोग नहीं किया जा सकता शीर्ष-स्तरीय वस्तुओं के लिए "। तो शीर्ष स्तर की वस्तुओं के लिए ऐसा करने का कोई तरीका है? – Dave

+0

@ डेव नहीं है, लेकिन आप उस पैकेज के लिए पैकेज ऑब्जेक्ट के अंदर ऐसा निहित डाल सकते हैं जिसमें 'ए' है। –

+0

@ डैनियल: क्या आपने कोशिश की? मैंने किया लेकिन किसी भी तरह संकलक द्वारा rebuffed मिला। मुझे नहीं पता कि मैंने अभी गलत किया है या वास्तव में इसकी अनुमति नहीं है। –

5
इसके बजाय Ordering[A] विस्तार की

, Ordered[A] विस्तार का प्रयास करें। इसलिए जैसा:

implicit val OrderingA = Ordering.by((_: A).i) 

आदेश जा रहा है आप एक ही वर्ग के लिए उनमें से कई प्रदान कर सकते हैं का मुख्य लाभ:

scala> case class A(val i:Int) extends Ordered[A] {def compare(o:A) = i-o.i} 
defined class A 

scala> A(1)<A(2) 
res0: Boolean = true 

scala> A(1)<A(0) 
res1: Boolean = false 

scala> new collection.immutable.TreeMap[A, String]() 
res3: scala.collection.immutable.TreeMap[A,String] = Map() 
+1

जिस तरह से काम करता है वह यह है कि कम प्राथमिकता निहित आदेश [ए] को ट्रीमैप के लिए ऑर्डर करने के लिए [ए] को परिवर्तित करता है।दुर्भाग्य से हम भंडारण के लिए ट्रीमैप्स को क्रमबद्ध करते हैं और ऑर्डरिंग की कक्षा थोड़ा अस्थिर है (कुछ $$ anon $ class)। – Dave

13

मन आप, वहाँ एक Ordering बनाने का एक थोड़ा कम वर्बोज़ तरीका है। यदि आपकी A कक्षा वास्तव में Ordered है, तो आपको बस इसे विस्तारित करना चाहिए। यदि नहीं, तो implicits का उपयोग करने के बजाय, आप एक ऑर्डरिंग स्पष्ट रूप से पास कर सकते हैं:

new collection.immutable.TreeMap[A, String]()(Ordering.by(_.i)) 
+0

संक्षिप्त, समझदार और लचीला लगता है। – javadba

+0

फिर से आया, ऊपर उठाना/टिप्पणी करना चाहता था लेकिन .. मैं पहले से ही ऐसा कर चुका हूं! – javadba

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

  • कोई संबंधित समस्या नहीं^_^