如何在scala中编写读取可读字符串

时间:2011-03-08 00:15:02

标签: string parsing serialization scala

在scala中,当你将一个字符串“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'

3 个答案:

答案 0 :(得分:1)

这就是序列化的意义所在。另外,为什么JSON很受欢迎。

答案 1 :(得分:1)

查看lift-json(https://github.com/lift/lift/tree/master/framework/lift-base/lift-json/)以写出将被另一种语言解析和读取的数据。 JSON在Web服务领域非常标准,用于请求/响应序列化,并且几乎所有语言都有JSON库。

要字面写出包含双引号的字符串,您还可以执行以下操作:

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

我发现像JSON这样稍微更结构化的格式更有用,而像lift-json这样的库在引用字符串而不引用Ints等方面是正确的。

答案 2 :(得分:1)

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

AFAIK,Scala中没有等效的eval()。 Daniel Spiewak之前已经谈过这个here。但是,如果你想要的话。我建议做以下事情:

  1. 每个集合对象都有3个方法,允许您将数据转换为字符串表示,无论如何。有mkStringaddStringstringPrefix。做一些聪明的事情(想想“反编译”你的内存ADT回到源代码形式),你将到达第2步)。实质上,您可以将List(1,2,3)创建的整数列表转换回字符串"List(1,2,3)"。对于更简单的字符串或整数这样的基本文字,你需要使用implicits对内置类型进行操作,以便为它们提供这些toString(我在这里重载术语)辅助方法。
  2. 现在你有了你的字符串表示,你可以考虑如何“解释”或“评估”它们。您将需要一个eval()函数,该函数创建一个解析器组合器的新实例,该组合器可以理解Scala的文字并为您重新组装数据结构。
  3. 实现这一点听起来很有趣。如果您已成功实施,请不要忘记在此发回。 :)