복붙노트

[SCALA] 스칼라에서 튜플에 케이스 클래스를 변환하는 쉬운 방법은 무엇입니까?

SCALA

스칼라에서 튜플에 케이스 클래스를 변환하는 쉬운 방법은 무엇입니까?

튜플에 케이스 클래스를 변환하는 쉬운 방법이 있나요?

나는 물론, 쉽게 쓰기 상용구 코드는이 작업을 수행 할 수 있습니다,하지만 난 보일러없이 의미한다.

내가 정말 후있어 쉽게 사전 식 정렬 된 경우 클래스를 만들 수있는 방법입니다. 나는 scala.math.Ordering.Implicits._을 가져 튜플의 목표를 달성 할 수 있으며, 짜잔, 내 튜플은 주문 그들을 위해 정의했습니다. 그러나 scala.math.Ordering의 implicits는 일반적으로 케이스 클래스에 대한 작동하지 않습니다.

해결법

  1. ==============================

    1.어떻게 적용 취소 호출에 대해 (). 동반자 개체를 얻을?

    어떻게 적용 취소 호출에 대해 (). 동반자 개체를 얻을?

    case class Foo(foo: String, bar: Int)
    
    val (str, in) = Foo.unapply(Foo("test", 123)).get
    // str: String = test
    // in: Int = 123
    
  2. ==============================

    2.볼품없는 당신을 위해이 작업을 수행 할 것입니다.

    볼품없는 당신을 위해이 작업을 수행 할 것입니다.

      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)
    

    성능은 지속적으로 변환하고 있기 때문에, 끔찍한 될 가능성이 높습니다. 당신은 아마, 다음 (Fnord.apply _). tupled 같은 것을 사용하여 다시 변환 종류의 것으로는 tupled 형태로 모든 변환 것입니다.

  3. ==============================

    3.당신은 TupleN이 확장 N = 1-22, 들어, ProductN의 특성을 확장하려고 할 수 있습니다. 그것은 _1 같은, _2 등의 방법 당신에게 튜플의 의미를 많이 줄 것이다. 당신이 당신의 유형을 사용하는 방법에 따라이 실제 튜플을 만들지 않고 충분한 수 있습니다.

    당신은 TupleN이 확장 N = 1-22, 들어, ProductN의 특성을 확장하려고 할 수 있습니다. 그것은 _1 같은, _2 등의 방법 당신에게 튜플의 의미를 많이 줄 것이다. 당신이 당신의 유형을 사용하는 방법에 따라이 실제 튜플을 만들지 않고 충분한 수 있습니다.

  4. ==============================

    4.이 같은 일을하는 동안이 오래된 스레드를 건너 왔어요. 나는 결국이 솔루션에 정착 :

    이 같은 일을하는 동안이 오래된 스레드를 건너 왔어요. 나는 결국이 솔루션에 정착 :

    case class Foo(foo: String, bar: Int)
    
    val testFoo = Foo("a string", 1)
    
    val (str, in) = testFoo match { case Foo(f, b) => (f, b) }
    
  5. from https://stackoverflow.com/questions/8087958/in-scala-is-there-an-easy-way-to-convert-a-case-class-into-a-tuple by cc-by-sa and MIT license