2011-11-10 16 views
43

क्या केस क्लास को टुपल में बदलने का कोई आसान तरीका है?स्कैला में, क्या केस क्लास को टुपल में बदलने का कोई आसान तरीका है?

मैं निश्चित रूप से ऐसा करने के लिए बॉयलरप्लेट कोड लिख सकता हूं, लेकिन मेरा मतलब बॉयलरप्लेट के बिना है।

मैं वास्तव में क्या कर रहा हूं यह एक केस क्लास लेक्सिकोोग्राफिक रूप से आदेश देने का एक तरीका है। मैं scala.math.Ordering.Implicits._, और voila आयात करके tuples के लिए लक्ष्य प्राप्त कर सकते हैं, मेरे tuples उनके लिए एक आदेश परिभाषित किया गया है। लेकिन scala.math.Ordering में implicits सामान्य रूप से कक्षा कक्षाओं के लिए काम नहीं करते हैं।

उत्तर

64

साथी ऑब्जेक्ट में unapply().get() पर कॉल करने के बारे में कैसे?

case class Foo(foo:String, bar:Int) 

val (str, in) = Foo.unapply(Foo("test", 123)).get() 
+3

आरपीएल 2.9.0-1 में सुझावों के लिए धन्यवाद, मुझे – Tanjona

+0

"बहुत" प्राप्त करने के लिए() को हटा देना था! मुझे –

+0

कूल के बारे में कोई जानकारी नहीं थी, यह काम किया! आपके सुझाव के साथ मैं अपना केस क्लास ऐसा करने में सक्षम था: 'वैल यह टुपल: ऑर्डर [[स्ट्रिंग, इंट)] = Foo.unapply (यह) .get; वैल thatTuple = Foo.unapply (वह) .get; यह टुपल की तुलना करें। यह दुनिया में सबसे सुंदर चीज़ नहीं है, इसलिए मैं अभी भी सुझावों के लिए खुला हूं, लेकिन आपका जवाब निश्चित रूप से काम पूरा हो जाता है। धन्यवाद! – Douglas

3

आप ProductN विशेषता, एन = 1-22, जो TupleN फैली के लिए विस्तार की कोशिश कर सकते। यह आपको _1, _2, आदि विधियों जैसे बहुत सारे ट्यूपल अर्थशास्त्र प्रदान करेगा। आप के आधार पर आप अपने प्रकार का उपयोग कैसे करते हैं, यह वास्तविक ट्यूपल बनाने के बिना पर्याप्त हो सकता है।

+0

मुझे यकीन नहीं है कि यह दृष्टिकोण मेरे लिए काम करने के लिए कैसे प्राप्त करें। मैं चाहता हूं कि मेरे केस क्लास को लेक्सिकोोग्राफिक रूप से ऑर्डर किया जाए या बॉयलरप्लेट के बहुत सारे लिखने के बिना, एक लेक्सिकोोग्राफिक ऑर्डरिंग हो। उत्पाद उत्पाद को विस्तारित करना scala.math.Ordering में implicits के साथ काम नहीं कर रहा है जो किसी को आसानी से एक लेक्सिकोग्राफिक ऑर्डर देने के लिए अनुमति देता है। – Douglas

0

इस पुराने धागे में आया था जबकि यह वही काम करने का प्रयास कर रहा था। मैं अंत में इस समाधान पर बसे:

case class Foo(foo: String, bar: Int) 

val testFoo = Foo("a string", 1) 

val (str, in) = testFoo match { case Foo(f, b) => (f, b) } 
0

Shapeless आपके लिए यह कार्य होगा।

import shapeless._ 
    import shapeless.syntax.std.product._ 

    case class Fnord(a: Int, b: String) 

    List(Fnord(1, "z - last"), Fnord(1, "a - first")).sortBy(_.productElements.tupled) 

res0: List[Fnord] = List(Fnord(1,a - first), Fnord(1,z - last)) 

productElements एक निराकार HList में एक मामला वर्ग बदल जाता है हो जाता है:

scala> Fnord(1, "z - last").productElements 
res1: Int :: String :: shapeless.HNil = 1 :: z - last :: HNil 

और HLists #tupled साथ tuples में बदल रही हैं:

scala> Fnord(1, "z - last").productElements.tupled 
res2: (Int, String) = (1,z - last) 

प्रदर्शन होरी होने की संभावना है खून, क्योंकि आप लगातार बदल रहे हैं। आप शायद सबकुछ tupled रूप में कनवर्ट करेंगे, इसे सॉर्ट करें, फिर इसे (Fnord.apply _).tupled जैसे कुछ का उपयोग करके वापस परिवर्तित करें।

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