在不使用反射的情况下获取案例类中所有变量的值

aa8*_*a8y 4 scala

是否有一种简单的方法可以在不使用反射的情况下获取案例类中所有变量的值.我发现反射很慢,不应该用于大规模应用中的重复任务.

我想要做的是覆盖toString方法,使它返回case类中所有字段的制表符分隔值,其顺序与它们在那里定义的顺序相同.

0__*_*0__ 12

我想要做的是覆盖toString方法,使它返回case类中所有字段的制表符分隔值,其顺序与它们在那里定义的顺序相同.

像这样?

trait TabbedToString {
  _: Product =>

  override def toString = productIterator.mkString(s"$productPrefix[", "\t", "]")
}
Run Code Online (Sandbox Code Playgroud)

编辑:解释 - 我们在这里使用自我类型,你也可以写this: Product =>self: Product =>.与继承不同,它只是声明这种类型(TabbedToString)必须混合成一个Product,因此我们可以调用productIteratorproductPrefix.所有案例类都自动继承该Product特征.

使用案例:

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

Person("Joe", 45).toString
Run Code Online (Sandbox Code Playgroud)


Arc*_*heg 5

你可以使用它的提取器:

case class A(val i: Int, val c: String) {
  override def toString = A.unapply(this).get.toString // TODO: apply proper formatting.
}

val a = A(5, "Hello world")
println(a.toString) 
Run Code Online (Sandbox Code Playgroud)

  • 试试`A.unapply(this).get.productIterator.mkString("\ t")` (2认同)