2012-10-30 10 views
5

Chciałbym napisać funkcję "toSource", która wygeneruje kod źródłowy dla podstawowych klas przypadków. Na przykład, chciałbym:Scala: Nadpisanie toString, więc cytaty są drukowane wokół ciągów znaków

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

Funkcja „toString” prawie daje mi to, co chcę, ale to krople cudzysłowy wokół ciągi:

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

Jakieś pomysły jak to zrobić?

Odpowiedz

5

Można wykorzystać fakt, że zajęcia case mix cechy 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)""" 
+2

który działa! I może być stworzony do pracy z zagnieżdżonymi klasami przypadków przez dodanie kolejnej sprawy: "case p: Product => toSource (p)" – emchristiansen

+0

Chciałbym, jeśli jest jakaś magiczna flaga kompilatora lub coś, co uczyni to domyślnym zachowaniem , wtedy można odróżnić 'Set()' i 'Set (" ")' – samthebest

Powiązane problemy