2012-10-30 72 views
5

我想編寫一個「toSource」函數,它將生成基本案例類的源代碼。例如,我想:Scala:重寫toString,以便在字符串周圍打印引號

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

任何想法如何做到這一點?

回答

5

你可以利用的事實,案件類的特質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

這一工程!並且可以通過添加另一個案例來處理嵌套案例類:「case p:Product => toSource(p)」 – emchristiansen

+0

如果存在某種魔術編譯器標誌或某種使其成爲默認行爲的東西,我會喜歡它,那麼可以區分'Set()'和'Set(「」)' – samthebest

相關問題