scala tuples case-class

En Scala, ¿hay una manera fácil de convertir una clase de caso en una tupla?



tuples case-class (4)

Encontré este viejo hilo mientras intentaba hacer lo mismo. Finalmente me decidí por esta solución:

case class Foo(foo: String, bar: Int) val testFoo = Foo("a string", 1) val (str, in) = testFoo match { case Foo(f, b) => (f, b) }

¿Hay alguna manera fácil de convertir una clase de caso en una tupla?

Por supuesto, puedo escribir fácilmente un código repetitivo para hacer esto, pero quiero decir sin el texto repetitivo.

Lo que realmente busco es una forma fácil de hacer una clase de caso ordenada lexicográficamente. Puedo lograr el objetivo de tuplas importando scala.math.Ordering.Implicits._ y voila, mis tuplas tienen un orden definido para ellos. Pero las implicaciones en Scala.math.Ordering no funcionan para las clases de casos en general.


Puede intentar extender el rasgo ProductN , para N = 1-22, que extiende TupleN . Le dará mucha semántica Tuple, como los métodos _1 , _2 , etc. Dependiendo de cómo uses tus tipos, esto podría ser suficiente sin crear una Tupla real.


¿Qué tal si unapply().get() en el objeto complementario?

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


Shapeless hará esto por ti.

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)

Obtiene

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

productElements convierte una clase de caso en una HList Shapeless:

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

Y HLists se convierten en tuplas con #tupled:

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

Es probable que el rendimiento sea horrible, ya que estás convirtiendo constantemente. Probablemente convertirías todo a la forma agrupada, ordenaría eso y luego lo convertiría usando algo como (Fnord.apply _).tupled .