我想对以下代码进行澄清:
object A {
val value: String = test
}
def test: String = {
println("potato")
"potato"
}
A.value // produces "potato" as stdout and assigns the value "potato" to `value`
A.value // further calls do NOT print "potato" to stdout
这是我对这种行为的解释。
这里,一次{em>执行一次函数test()
,并且该函数的 value 被分配给{{1} }。进一步调用value
只需调用存储的值,而无需调用该函数。
任何人都可以确认吗?
还有,有什么方法可以强制重新调用该函数?
答案 0 :(得分:2)
我确认,这就是事实。
您可以执行以下操作:
object A {
def value: String = test
}
def test: String = {
println("potato")
"potato"
}
将属性转换为方法,从而在每次调用时调用方法test。
使用Scala合糖,您仍然可以使用A.value
语法。
会令人满意吗?
答案 1 :(得分:2)
还有更多的东西。请考虑以下内容。
object A {
val value: String = test
val num = 55
}
def test: String = {
println("potato")
"potato"
}
// first reference to A
A.num // produces "potato" to stdout and assigns the value "potato" to A.value
如果将A.value
声明为lazy val
,则在test
的第一个引用之前不会调用A.value
。如果A.value
是def
,则在每次引用test
时都会调用A.value
。