5

基本的なケースクラスのソースコードを生成する「toSource」関数を作成したいと思います。たとえば、私は欲しいです:

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

「toString」関数は、私が望むものをほぼ提供しますが、文字列を引用符で囲みます。

println(bob.toString) // Prints """Person(Bob, 20)"""

これを行う方法はありますか?

4

1 に答える 1

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)"""
于 2012-10-30T23:37:24.493 に答える