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

时间:2015-11-18 20:14:22

标签: scala

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

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

2 个答案:

答案 0 :(得分:11)

  

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

喜欢这个吗?

trait TabbedToString {
  _: Product =>

  override def toString = productIterator.mkString(s"$productPrefix[", "\t", "]")
}

修改说明 - 我们在此处使用self-type,您也可以撰写this: Product =>self: Product =>。与继承不同,它只是声明此类型(TabbedToString)必须混合到Product中,因此我们可以调用productIteratorproductPrefix所有案例类都会自动继承Product特征。

用例:

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

Person("Joe", 45).toString

答案 1 :(得分: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)