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

柯鴻儀*_*柯鴻儀 0 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
Run Code Online (Sandbox Code Playgroud)

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

我想在重新声明变量num后var num=789,scala重新创建符号表中具有相同符号num的其他项.

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

谢谢.

Nya*_*vro 5

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

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