据我所知,在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重新创建另一个项目。
我对吗?为什么结果3输出10456而不是10789。
谢谢。
在Scala中,def不代表懒惰的评估表达式,它是函数定义。因此,当您声明def i = 10000 + num时,您将获得新函数。然后当你声明var num = 789时,在函数i中使用了这个新的'num'阴影'num'。
这可能只在REPL中有可能,如果你试图在方法的范围内使这个技巧,它将无法编译,因为var'num'多次声明
这是因为你在翻译工作,当你做第二个var num = 789
时,你声明了一个与之前的num
无关的新变量。所以你的方法i
仍然引用旧变量。如果你写num = 789
你改变现有的变量,这就是反映变化的原因。
def i = ???
也只是一种方法而不是懒惰的评价,尽管行为有点类似。在scala中,您可以使用lazy val i = 10000 + num
来表示延迟评估。它会在您执行它时计算它们,然后缓存结果并且不会在第二次重新计算该值