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

时间:2015-11-14 07:41:01

标签: scala lazy-evaluation read-eval-print-loop

据我所知,在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 重新创建符号表中的其他项。

我是对的吗?为什么rsult 3输出10456而不是10789。

谢谢。

2 个答案:

答案 0 :(得分:5)

在Scala中,def不代表懒惰的评估表达式,它是函数定义。因此,当您声明def i = 10000 + num时,您将获得新的函数。然后,当你声明var num = 789这个新的' num'阴影' num'用于函数i。

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

答案 1 :(得分:2)

这是因为您正在使用口译员,当您执行第二次var num = 789时,您声明了变量,该变量与之前的num无关。因此,您的方法i仍然引用旧变量。如果您编写num = 789,则更改现有变量,这就是反映更改的原因。

同样def i = ???只是一种方法而不是懒惰的评估,尽管行为有点类似。在scala中,您可以使用lazy val i = 10000 + num来表示延迟评估。它会在您执行它时计算它们,然后缓存结果并且不会在第二次重新计算该值