Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala调试_Scala_Debugging - Fatal编程技术网

Scala调试

Scala调试,scala,debugging,Scala,Debugging,我是Scala的新手,我已经用IntelliJ设置了一个环境。我发现了一个无法解释的问题,代码如下: object HelloWorld extends App{ print("before") var aMap = Map("A"->1, "B"->2) println("after") println(aMap) } 我注意到println(aMap)可以清晰地打印出Map(“A”->1,“B”->2),所以我想调试一下,看看Map是否实现了fu

我是Scala的新手,我已经用IntelliJ设置了一个环境。我发现了一个无法解释的问题,代码如下:

object HelloWorld extends App{
    print("before")
    var aMap = Map("A"->1, "B"->2)
    println("after")
    println(aMap)
}
我注意到
println(aMap)
可以清晰地打印出
Map(“A”->1,“B”->2)
,所以我想调试一下,看看
Map
是否实现了
funcn
,它将由
println
使用IntelliJ调用。因此,我设置了一个调试点:

println(aMap)
当我“进入”函数时,似乎再次调用了
var aMap=Map(“A”->1,“B”->2)
!那么,第二次调用它的原因是什么呢?

所有顶级字段(
var/val
)也都被转换为有助于实现a概念的方法

变成

var map = Map(1->2)
def map = map
def map_=(nValue: Map[Int.Int]) {map = nValue}

val list = List(1,2)
def list = list
// No setters for vals
因此,当您调用
println(aMap)
时,它使用隐藏的访问器方法来获取aMap的值

这一切之所以发生,是因为您处于对象的顶层。如果采用以下方法:

object HelloWorld extends App{
  def run() {
    print("before")
    var aMap = Map("A"->1, "B"->2)
    println("after")
    println(aMap)
  }
  run()
}

然后,
var aMap
将是一个局部变量,不使用间接查找。

您如何知道赋值被再次调用?在堆栈跟踪中看到它了吗?aMap的内存引用是否已更改?如果将
var
更改为
val
,会发生什么情况?@Jordan Parmer是的,我看到了调用堆栈,当点击println(aMap)并按F7进入时,我可以看到调用帧顶部是var aMap的行…,在python中,如果要打印对象,它将调用object str方法,我认为scala可能有这样的特性,结果是var aMap=…这一行又被击中了,我不知道原因,jdk是17u55 scala是2.11.0I改为val,似乎val aMap=。。这条线又被击中了。我并不是说作业会被再次调用,我只是说在调试模式下使用step-into,似乎第二行又被点击了,我不知道原因。我遗漏了什么吗?还不清楚是什么困扰着你——你是说有一个变量aMap分配了两次,还是什么?如果是这样的话,正如Jordan所说,您可以检查对象引用(看起来像散列)是否已更改——这是上述场景的证据,否则这只是调试器的一个缺点,很可能会与之混淆。
object HelloWorld extends App{
  def run() {
    print("before")
    var aMap = Map("A"->1, "B"->2)
    println("after")
    println(aMap)
  }
  run()
}