Scala:覆盖toString,以便在字符串周围打印引号

emc*_*sen 5 serialization scala introspection

我想写一个"toSource"函数,它将生成基本案例类的源代码.例如,我想:

case class Person(name: String, age: Int)
val bob = Person("Bob", 20)
println(toSource(bob)) // Should print """Person("Bob", 20)"""
Run Code Online (Sandbox Code Playgroud)

"toString"函数几乎给了我想要的东西,但它会丢弃字符串的引号:

println(bob.toString) // Prints """Person(Bob, 20)"""
Run Code Online (Sandbox Code Playgroud)

任何想法如何做到这一点?

0__*_*0__ 6

您可以利用案例类混合特征的事实Product:

def toSource(p: Product): String =
   p.productIterator.map {
      case s: String => "\"" + s + "\""
      case other => other.toString
   } mkString (p.productPrefix + "(", ", ", ")")

toSource(Person("Bob", 20))  // yields """Person("Bob", 20)"""
Run Code Online (Sandbox Code Playgroud)

  • 这样可行!并且可以通过添加另一个案例来使用嵌套的case类:"case p:Product => toSource(p)" (2认同)
  • 如果有某种神奇的编译器标志或使其成为默认行为的东西,我会喜欢它,然后人们可以区分 `Set()` 和 `Set("")` (2认同)