2012-10-30 12 views
5

के आसपास मुद्रित किए गए हैं, मैं एक "टूसोर्स" फ़ंक्शन लिखना चाहता हूं जो मूल केस कक्षाओं के लिए स्रोत कोड उत्पन्न करेगा। उदाहरण के लिए, मैं चाहता हूँ:स्कैला: ओवरराइड टूस्ट्रिंग तो उद्धरण

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

काम करता है यही कारण है कि! और इसे एक और मामला जोड़कर नेस्टेड केस क्लास के साथ काम करने के लिए बनाया जा सकता है: "केस पी: उत्पाद => टूसोर्स (पी)" – emchristiansen

+0

अगर मैं किसी प्रकार का जादू कंपाइलर ध्वज या डिफ़ॉल्ट व्यवहार करने के लिए कुछ करता तो मुझे यह अच्छा लगेगा , तो कोई 'सेट() 'और' सेट (" ") 'के बीच अंतर कर सकता है – samthebest