Scala中,为什么def重新定义def表达式中使用的变量后不生效

In Scala,why def not take effect after re-defining the variable used in the def expression

据我了解,在 scala 中 def 用于使表达式被延迟计算。

例如:

var num=123;
def  i=10000+num;
print(i); 
//result 1: ouput 10123

num=456
print(i) 
//result 2: output 10456

var num=789
print(i)
//result 3: output 10456

我的问题是,在 var num=789 之后,为什么 def i=10000+num 没有评估为 10789。

我猜想在通过 var num=789 重新声明变量 num 之后,scala 用相同的符号 num[=28= 重新创建符号 table 中的另一个项目].

我说的对吗?为什么 result 3 输出 10456 而不是 10789.

谢谢。

在 Scala 中 def 不代表惰性求值表达式,它是函数定义。因此,当您声明 def i=10000+num 时,您会得到新的 function。然后当您声明 var num=789 这个新的 'num' 阴影 'num' 在函数 i.

中使用

这可能只有在 REPL 中才有可能,如果你试图在方法的范围内使用这个技巧,它不会编译,因为 var 'num' 声明了多次

这是因为您在解释器中工作,当您执行第二个 var num = 789 时,您声明了 new 变量,该变量与之前的 num.所以你的方法 i 仍然引用旧变量。如果你写 num = 789 你改变了现有的变量,这就是改变被反映出来的原因。

另外 def i = ??? 只是一种方法而不是惰性评估,尽管行为有些相似。在 Scala 中,您可以使用 lazy val i = 10000 + num 来表示惰性求值。执行时会计算一个,然后缓存结果,第二次不重新计算该值