【问题标题】:how to write read readable strings in scala如何在scala中编写可读的字符串
【发布时间】:2011-07-10 18:14:19
【问题描述】:

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

【问题讨论】:

  • 使用三引号怎么样? println("""他说,"Scala 摇滚!"""")
  • 如果您误用了答案的命令,您的答案将无法被接受。

标签: string parsing serialization scala


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    查看 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 等方面做得正确。

    【讨论】:

      【解决方案3】:

      我认为您正在寻找类似 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)"。对于更基本的文字,例如简单的字符串或整数,您需要使用隐式来拉动内置类型,以便为它们提供这些 toString(我在这里重载了这个术语)辅助方法。
      2. 现在您有了字符串表示,您可以考虑如何“解释”或“评估”它们。您将需要一个 eval() 函数来创建解析器组合器的新实例,该实例能够理解 Scala 的文字并为您重新组装数据结构。

      实现这一点实际上听起来很有趣。如果您已成功实施,请不要忘记在此处发帖。 :)

      【讨论】:

        猜你喜欢
        • 2017-05-22
        • 2012-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-20
        • 2011-02-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多