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
来表示惰性求值。执行时会计算一个,然后缓存结果,第二次不重新计算该值
据我了解,在 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
来表示惰性求值。执行时会计算一个,然后缓存结果,第二次不重新计算该值