我有一个元组
val tuple = ("Mike", 40)
和一个案例类
case class Person(name: String, age: Int)
如何将我的元组打包到 Person 类的对象?除了这个还有什么办法:
new Person(tuple._1, tuple._2)
也许有些像
tuple.asInstanceOf[Person]
谢谢。
我有一个元组
val tuple = ("Mike", 40)
和一个案例类
case class Person(name: String, age: Int)
如何将我的元组打包到 Person 类的对象?除了这个还有什么办法:
new Person(tuple._1, tuple._2)
也许有些像
tuple.asInstanceOf[Person]
谢谢。
元组的
您可以将Person.apply
方法转换为函数,然后tupled
在函数上使用方法:
(Person.apply _) tupled tuple
在extendsscala 2.11.8
的scala 2.12
伴随对象中,所以这就足够了:case class
FunctionN
Person tupled tuple
模式匹配
new Person(tuple._1, tuple._2)
没有丑陋_N
方法的类似物是模式匹配:
tuple match { case (name, age) => Person(name, age) }
小“只是为了好玩”的版本,可以进一步抽象。当然,在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)
您可以定义一个进行转换的隐式。我在参数化测试中使用它来提高可读性。
// 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)
);
我喜欢这种语言。
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)