21

我有一个元组

val tuple = ("Mike", 40)

和一个案例类

case class Person(name: String, age: Int)

如何将我的元组打包到 Person 类的对象?除了这个还有什么办法:

new Person(tuple._1, tuple._2)

也许有些像

tuple.asInstanceOf[Person]

谢谢。

4

4 回答 4

40

元组的

您可以将Person.apply方法转换为函数,然后tupled在函数上使用方法:

(Person.apply _) tupled tuple

在extendsscala 2.11.8scala 2.12伴随对象中,所以这就足够了:case classFunctionN

Person tupled tuple

模式匹配

new Person(tuple._1, tuple._2)没有丑陋_N方法的类似物是模式匹配:

tuple match { case (name, age) => Person(name, age) }
于 2013-07-05T08:33:23.677 回答
4

小“只是为了好玩”的版本,可以进一步抽象。当然,在shapeless的帮助下:

  import shapeless._
  import Tuples._

  case class Person(name: String, age: Int)
  val tup = ("Alex", 23)

  val personIso = Iso.hlist(Person.apply _, Person.unapply _)

  personIso.from(tup.hlisted)
于 2013-07-05T11:50:19.063 回答
3

您可以定义一个进行转换的隐式。我在参数化测试中使用它来提高可读性。

// Define adults with tuples
implicit def makePerson(in:(String,Int))=new Person(in._1,in._2);
// Define kids with triples
implicit def makeUnderagePerson(in:(String, Int, String))=new Person(in._1,in._2, new Person(in._3));

//create single person:
val person:Person=("Mike", 40)

//crate a list of persons:
//
//Remember to type the list, this is what forces the implicit on each tuple.
//                     ||
//                     \/
val personList=List[Person](
("Mike", 40),
("Jane", 41),
("Jack", 42),
// Uses the implicit ment for kids. 
("Benjamin", 5, Jack)
);

我喜欢这种语言。

于 2014-02-11T12:26:45.483 回答
0

Scala 3 对元组和案例类之间的转换具有一流的支持:

scala> val tuple = ("Mike", 40)
val tuple: (String, Int) = (Mike,40)

scala> case class Person(name: String, age: Int)
// defined case class Person

scala> val person: Person = summon[deriving.Mirror.ProductOf[Person]].fromProduct(tuple)
val person: Person = Person(Mike,40)

scala> Tuple.fromProductTyped[Person](person)                                                                                                                                   
val res1: (String, Int) = (Mike,40)
于 2021-09-16T13:01:50.177 回答