Scalac和Repl之间的不一致

时间:2013-06-25 14:23:27

标签: scala

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

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

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

1 个答案:

答案 0 :(得分:4)

您的问题是source file encoding

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")之后,您会在每一行中获得\rCarriage return)。

作为修补程序,您可以在(\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