2011-11-10 4 views
43

사례 클래스를 튜플로 변환하는 쉬운 방법이 있습니까?스칼라에서 케이스 클래스를 튜플로 변환하는 쉬운 방법이 있습니까?

물론 이것을 수행하기 위해 상용구 코드를 쉽게 작성할 수 있지만, 상용구 없이는 가능합니다.

필자가 실제로하는 것은 쉽게 사전 순차적으로 사례 클래스를 만드는 방법입니다. scala.math.Ordering.Implicits._ 및 voila를 가져 와서 튜플에 대한 목표를 달성 할 수 있습니다. 튜플에 정의 된 Ordering이 있습니다. 그러나 scala.math.Ordering의 암시는 일반적으로 사례 클래스에서는 작동하지 않습니다.

답변

64

컴패니언 개체에서 unapply().get()을 호출하는 것은 어떻습니까? 당신은 N = 1-22, TupleN이 확장에 대한 ProductN 특성을 확장 시도 할 수

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

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

팁을 주셔서 감사합니다. REPL 2.9.0-1에서()을 (를) 제거해야했습니다. "얻으십시오" – Tanjona

+0

매우 멋지다! 나는 적용 할 수 없다는 것에 대해 전혀 몰랐다. –

+0

멋지다. 당신의 제안으로 나는 나의 케이스 클래스를 얻을 수 있었다. 이렇게 주문했다 :'val thisTuple : Ordered [(String, Int)] = Foo.unapply (this) .get; val thatTuple = Foo.unapply (그) .get; thisTuple은 thatTuple'을 비교합니다. 세계에서 가장 예쁜 것은 아니기 때문에 제안은 여전히 ​​열려 있지만 답변은 확실합니다. 감사! – Douglas

3

. _1, _2 등의 Tuple 의미 체계를 많이 제공합니다. 유형을 사용하는 방법에 따라 실제 튜플을 만들지 않고도 충분할 수 있습니다.

+0

이 접근법을 어떻게 작동 시킬지 모르겠습니다. 내 사례 클래스가 사전 적으로 순서가 정해져 있거나 많은 상용구를 작성하지 않고도 사전 식 순서를 사용하기를 원합니다. ProductN 확장은 scala.math.Ordering에있는 함축으로 작동하지 않는 것으로 보인다. 튜링을 쉽게 사전 순으로 정렬 할 수있게 해준다. – 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와 튜플로 변환됩니다

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

성능 horri 일 가능성이있다 당신이 끊임없이 개종하고 있기 때문에. 당신은 아마도 모든 것을 변환 된 형태로 변환하고, 정렬 한 다음 과 같은 것을 사용하여 다시 변환 할 것입니다.

관련 문제