是否有一种简单的方法可以在不使用反射的情况下获取案例类中所有变量的值。我发现反射很慢,不应该用于大规模应用中的重复性任务。
我想要做的是覆盖toString
方法,使它返回case类中所有字段的制表符分隔值,其顺序与它们在那里定义的顺序相同。
答案 0 :(得分:11)
我想要做的是覆盖
toString
方法,以便它返回case类中所有字段的制表符分隔值,其顺序与它们在那里定义的顺序相同。
喜欢这个吗?
trait TabbedToString {
_: Product =>
override def toString = productIterator.mkString(s"$productPrefix[", "\t", "]")
}
修改说明 - 我们在此处使用self-type,您也可以撰写this: Product =>
或self: Product =>
。与继承不同,它只是声明此类型(TabbedToString
)必须混合到Product
中,因此我们可以调用productIterator
和productPrefix
。 所有案例类都会自动继承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)