2014-03-26 31 views
1

我有一個對象,它是一個案例類的集合。這就是它看起來像打印的樣子。斯卡拉物體作爲文字

Sentence(List(),List(Word(Anarchism,Anarchism,NNP,I-NP,O,N), Word(.,.,.,O,O,.))) 

是否有可能產生產生該對象的scala文字?實際的例子比較複雜,還包括一些需要轉義的字符。預期結果將類似於

Sentence(Seq(), Seq(Word("Anarchism", "Anarchism", "NNP", "I-NP", "O", "N"), Word(".", ".", ".", "O", "O", "."))) 
+0

農產品作爲什麼......一個字符串?一個AST片段? –

+0

@ 0__一個字符串。添加。 – Reactormonk

回答

2

事情是這樣的:

def scalaCodeForObject(x: Any): String = x match { 
    // handle primitives 
    case s: String => 
    // trim is used to make the strings clearer 
    val escaped = s.replaceAll("""\""", """\\""").replaceAll(""" " """.trim, """ \" """.trim) 
    s""" "$escaped" """.trim 
    case i: Int => i.toString 
    ... 
    // all case classes are Products 
    case p: Product => 
    val className = x.getClass.getSimpleName 
    val fields = p.productIterator 
    fields.map(scalaCodeForObject _).mkString(", ", className + "(", ")") 
    // handle other cases you need, e.g. lists, other seqs, maps, etc. 
} 
+0

人們經常問這個問題,所以它應該在'ScalaRunTime.stringOf'旁邊有一個地方,並且有一個REPL選項來使用它。 –

+1

對於產品,我會使用'productPrefix'而不是'getClass.getSimpleName'。在SuperCollider中,這個過程被稱爲'.asCompileString',其思想是編譯結果字符串將重現特定的結構,以便作爲序列化的一種形式。 –

+1

實際上,在這種情況下,使用'getClass.getSimpleName'更合適,因爲'productPrefix'可以被重寫,然後您將得到一個引用一個不存在的類的表達式。 –