2011-03-08 68 views
2

斯卡拉读可读的字符串,当你写了一个字符串“Hello World”到一个文件中写入如何写在斯卡拉

的Hello World

(注:没有双引号)。

Lisp有打印和写入的概念。其中写道:没有双引号,其他包括他们可以很容易地写出来的数据结构和读回后使用标准的读卡器。

反正有没有做到这一点在Scala呢?

有了一个字符串,这很容易对其进行格式化 - 但很多深层嵌套结构,它几乎是不可能的。

例如,说我有

sealed trait PathSegment 
case class P(x:String) extends PathSegment 
case class V(x:Int) extends PathSegment 

要创建一个作用:

P("X") 

V(0) 

这些PathSegments打印为列表:

List(P(paths), P(/pets), P(get), P(responses), V(200)) 

我想这打印出:

List(P("paths"), P("/pets"), P("get"), P("responses"), V(200)) 

换句话说,我想串(和字符),无论身在何处的结构发生打印出来作为"foo"'c'

+2

如何使用三重引号? println(“”“他说,”斯卡拉岩石!“”“”) – mpilquist 2011-03-08 00:39:59

+0

如果你错误地使用了你的答案,你的答案是不能接受的。 – 2011-03-08 02:58:26

回答

1

这什么序列化是关于。另外,为什么JSON很受欢迎。

1

退房升JSON(https://github.com/lift/lift/tree/master/framework/lift-base/lift-json/)写入数据指出,将被解析并通过另一种语言读出。 JSON在Web服务领域是非常标准的请求/响应序列化,并且几乎每种语言都有JSON库。

要逐字写出一个字符串包括双引号,你也可以做这样的事情:

""" 
The word "apple" is in double quotes. 
""" 

我找到像JSON稍微更结构化的格式更实用,像电梯,JSON库做的在引用字符串,而不是引用int类型而言正确的事,等

1

我认为你正在寻找的东西像JavaScript的eval() + JSON和Python的eval()str()repr()。本质上,你需要Lispy对称的元圆形评估。这意味着您可以将数据转换为源代码,并评估该源代码并返回相同的数据,对不对?

AFAIK,有Scala中没有eval()等同。 Daniel Spiewak在此之前已经谈到了here。但是,如果你想要的话。我建议以下几点:

  1. 每个集合对象都有3个方法可以让你无论如何都能将它的数据转换为字符串表示。有mkString,addStringstringPrefix。对他们做一些巧妙的事情(想一想“将你的内存中ADT反编译成源代码形式”),你就会到达步骤2)。实质上,您可以将由List(1,2,3)创建的整数列表转换回字符串"List(1,2,3)"。对于更简单的字符串或整数等更基本的文字,您需要使用implicits来提供内置类型,以便为它们提供这些toString(我将这里的术语超载)辅助方法。
  2. 现在你有了你的字符串表示,你可以考虑如何“解释”或“评估”它们。你需要一个eval()函数来创建一个解析器组合器的新实例,该实例理解Scala的文字并为你重新组装数据结构。

实现这个实际上听起来很有趣。如果您已成功实施它,请不要忘记在这里回复。 :)