为什么REPL和scala编译器中的`.split`函数有不同的行为

时间:2016-03-22 04:28:59

标签: scala

在REPL中考虑以下内容

scala> val  a = "1 2 3"
a: String = 1 2 3

scala> a.split(" ")
res0: Array[String] = Array(1, 2, 3)

在编译器中考虑以下内容

  val s = readLine()
  println(s.split(" ")) // outputs [Ljava.lang.String;@5ebec15
  println(s.toList)     // outputs List(1,  , 2,  , 3)

为什么同一功能有不同的输出,即

Array(1, 2, 3)

vs

[Ljava.lang.String;@5ebec15

我认为两者都有相同的输出

我错过了什么

3 个答案:

答案 0 :(得分:3)

repl输出与println输出不同。 println输出.toString

scala>  val  a = "1 2 3"
a: String = 1 2 3

scala> a.split(" ").toString
res0: String = [Ljava.lang.String;@5f84486a

在某些情况下,repl会打印出.toString,例如。当对象是List或case对象时。但是当涉及到阵列时,它会更智能并实际打印阵列的内容。

答案 1 :(得分:0)

我在工作表中尝试了以下内容,但没有区别。

val s = "1 2 3"                                 //> s  : String = 1 2 3
s.split(" ")                                    //> res0: Array[String] =     Array(1, 2, 3)
  println(s.toList)                               //> List(1,  , 2,  , 3)

在两种情况下,s.split的返回都是一个数组。当你将数组传递给println函数时,它会输出一个实际上正确的字符串。

答案 2 :(得分:0)

关于您的后续问题,与REPL的输出不完全相同,但以下两种方法将打印数组的元素。另请参阅Printing array in Scala

中的讨论
scala> val  a = "1 2 3"
a: String = 1 2 3

scala> println(a.split(" ")) // outputs a.split(" ").toString
[Ljava.lang.String;@5fd62371

scala> println(runtime.ScalaRunTime.stringOf(a.split(" ")))
Array(1, 2, 3)

scala> println(a.split(" ").deep)
Array(1, 2, 3)