鉴于:
case class Foo(a: Int, b: String, c: Double)
Run Code Online (Sandbox Code Playgroud)
你可以说:
val params = Foo(1, "bar", 3.14).productIterator.toList
Run Code Online (Sandbox Code Playgroud)
得到:
params: List[Any] = List(1, bar, 3.14)
Run Code Online (Sandbox Code Playgroud)
有没有办法"向后"并直接从此列表重新创建Foo对象,即:
Foo.createFromList(params) // hypothetical
Run Code Online (Sandbox Code Playgroud)
而不是写:
Foo(params(0).asInstanceOf[Int], params(1).asInstanceOf[String], params(2).asInstanceOf[Double])
Run Code Online (Sandbox Code Playgroud)
编辑:似乎它归结为能够将列表的元素作为参数发送到函数而不显式写出来,例如:
def bar(a: Int, b: Int, c: Int) = //...
val list = List(1, 2, 3, 4, 5)
bar(list.take(3)) // hypothetical, instead of:
bar(list(0), list(1), list(2))
Run Code Online (Sandbox Code Playgroud)
我希望能做到:
bar(list.take(3): _*)
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用.
编辑:解决方案基于extempore的答案,但直接调用构造函数而不是使用apply方法:
case class Foo(a: Int = 0, b: String = "bar", c: Double = 3.14) {
val cs = …Run Code Online (Sandbox Code Playgroud) scala ×1