2014-03-26 32 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'可以被重写,然后您将得到一个引用一个不存在的类的表达式。 –