0

我在 InteliJ 中使用了 scala 工作表并遇到了一个问题,即右侧(类似 REPL 的输出)显示的内容似乎是命名空间或内存地址,而不是对人类有用的文字值。

在scala REPL(不是IntelliJ)中,以下内容非常理智

scala> val nums = new Array[Int](10)
nums: Array[Int] = Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0)

但是,在 Scala 工作表中,同样会产生不太有用的输出

nums: Array[Int] = [I@1a2a52bf

经过一些简单的谷歌搜索和阅读后,我尝试了以下

val nums = new Array[Int](10)
nums
nums.toString()
nums.mkString(", ")

哪个输出

nums: Array[Int] = [I@1a2a52bf
res0: Array[Int] = [I@1a2a52bf
res1: String = [I@1a2a52bf
res2: String = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

我缺少一个简单的解决方案或解释。有没有人遇到过这个并修复过它?

这是一个工作表屏幕截图供参考:

截屏

4

1 回答 1

3

IntelliJ 的工作表用于toString打印变量。Array[Int]在 Scala 中对应于 Java int[],它不会覆盖Object'toString方法。

这是ObjecttoString方法:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

另一方面,Scala 的 REPL 对某些类有特殊的逻辑,Array其中包括。

没有什么可以“修复”的,这只是这些工具的设计方式。如果您想在 Idea 的工作表中漂亮地打印 Array 的值,请使用java.util.Arrays.toString 或将值转换为另一个集合:

val a = Array(1,2,3)
a.toString
java.util.Arrays.toString(a)
a.toSeq

产生:

a: Array[Int] = [I@4df3d702
res0: String = [I@4df3d702
res1: String = [1, 2, 3]
res2: Seq[Int] = WrappedArray(1, 2, 3)
于 2016-09-27T05:57:22.107 回答