2012-10-30 2 views
5

기본 사례 클래스의 소스 코드를 생성하는 "toSource"함수를 작성하고 싶습니다.스칼라 : 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