2012-10-30 11 views
5

Ich möchte eine "toSource" -Funktion schreiben, die den Quellcode für grundlegende Fallklassen generieren wird. Zum Beispiel würde Ich mag:Scala: Override toString, so dass Anführungszeichen um Strings gedruckt werden

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

Der „toString“ -Funktion gibt mir fast, was ich will, aber es fällt die Anführungszeichen um Strings:

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

Irgendwelche Ideen, wie dies zu tun?

Antwort

5

Sie die Tatsache, dass Product Fallklassen mischen Merkmal ausnutzen könnten:

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)""" 
+2

, das funktioniert! Und es kann gemacht werden, mit geschachtelten Fallklassen zu arbeiten, indem ein anderer Fall hinzugefügt wird: "Fall p: Produkt => toSource (p)" – emchristiansen

+0

Ich würde es lieben, wenn es irgendeine Art von magischen Compiler-Flag oder etwas, um dies zum Standardverhalten zu machen , dann kann man zwischen 'Set()' und 'Set (" ")' unterscheiden – samthebest

Verwandte Themen