对案例类字段的简单迭代

时间:2014-04-17 08:41:14

标签: scala case-class

我正在尝试编写一个泛型方法来迭代案例类的字段:

case class PriceMove(price: Double, delta: Double)

def log(pm : PriceMove) { info("price -> " + price + " delta -> " + delta)}

我需要让log能够处理任何案例类。 什么需要log只能处理case类的参数类型和实际的泛型字段迭代代码?

2 个答案:

答案 0 :(得分:11)

好的,考虑到我对这个问题所附带的两个问题,这就是我的用法:

object Implicits {
  implicit class CaseClassToString(c: AnyRef) {
    def toStringWithFields: String = {
      val fields = (Map[String, Any]() /: c.getClass.getDeclaredFields) { (a, f) =>
        f.setAccessible(true)
        a + (f.getName -> f.get(c))
      }

      s"${c.getClass.getName}(${fields.mkString(", ")})"
    }
  }
}

case class PriceMove(price: Double, delta: Double)

object Test extends App {
  import Implicits._
  println(PriceMove(1.23, 2.56).toStringWithFields)
}

这会产生:

PriceMove(price -> 1.23, delta -> 2.56)

答案 1 :(得分:1)

我担心没有简单的方法可以实现您所追求的目标,因为您无法轻松获取案例类中的字段名称,如此处所述:Reflection on a Scala case classGeneric customisation of case class ToString

您可以尝试使用反射(尽管可以保证字段的顺序)或tools.nsc.interpreter.ProductCompletion,但这两种解决方案都比您真正期望的要复杂得多。