Scala调试
我是Scala的新手,我已经用IntelliJ设置了一个环境。我发现了一个无法解释的问题,代码如下: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
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()
}