1

我编写了一个简短的函数来从多行字符串文字中去除前导空格并将这些行连接起来,就好像您写出了几个连接的字符串或一个非常长的字符串一样。

def stripMultiline(input : String) = 
  input.split("\n").map(_.dropWhile(_.isWhitespace).stripLineEnd).mkString

它按照我在 REPL 中所期望的方式工作:

scala> val longString =
     | """
     |   one fish,
     |   two fish,
     |   red fish,
     |   blue fish
     | """

scala> stripMultiline(longString)
res0: String = one fish, two fish, red fish, blue fish

但是,如果我将相同的代码放入一个main方法并用 编译它scalac,我会看到一些不同的东西:

package substitutions

object Main {
  def stripMultiline(input : String) = 
    input.split("\n").map(_.dropWhile(_.isWhitespace).stripLineEnd).mkString

  def main(args : Array[String]): Unit = {
    val text = 
    """
      one fish, 
      two fish, 
      red fish, 
      blue fish
    """

    val oneLine = stripMultiline(text)
    println(oneLine)
  }
}

(回到控制台)

C:\KC\code\scala\sub>scala substitutions.Main
blue fish

我正在Scala 2.10为 REPL 和 Scalac 运行。我在 Windows 7 32 位和 64 位上看到了错误。谁能想到为什么这两个版本的行为不一样?它让我陷入了困境。这是我的逻辑问题,还是我应该提交错误报告?

4

1 回答 1

4

您的问题是源文件编码

scala> stripMultiline("\r\n      one fish, \r\n      two fish, \r\n      red fish, \r\n      blue fish\r\n    ")
"lue fish ng = "one fish,

scala> stripMultiline("\n      one fish, \n      two fish, \n      red fish, \n      blue fish\n    ")
res1: String = one fish, two fish, red fish, blue fish

在每一行split("\n")得到\r回车)之后。

作为修补程序,您可以在以下位置拆分您的线路(\r)?\n

def stripMultiline(input : String) =
  input.split("(\r)?\n").map(_.dropWhile(_.isWhitespace).stripLineEnd).mkString
stripMultiline: (input: String)String

scala> stripMultiline("\r\n      one fish, \r\n      two fish, \r\n      red fish, \r\n      blue fish\r\n    ")
res0: String = one fish, two fish, red fish, blue fish
于 2013-06-25T14:34:19.407 回答