我试图了解Scala的工作原理。所以我输入了这段代码。
var name = "eMmanuel"
val n = name.exists(_.isUpper)
name = "book"
只是看着它,在我看来,我希望n
为true
,我编译它和n: Boolean = true
,这是可以理解的。但在控制台中我看到一些奇怪的东西。
name: String = book
n: Boolean = true
name: String = book
编译后,来自控制台的第一行结果现在告诉我name: String = book
,如果name
现在是String = book
,为什么n: Boolean = true
?这不应该是false
吗?因为毕竟它显示name: String = book
显然没有大写字母!
答案 0 :(得分:5)
我假设name = book
实际上是name = "book"
。
n
的值会保持不变,因为它是val
。 val
仅在分配时评估一次(还有lazy val
在第一次取消引用时评估)。 参见例如here 了解更多信息。
在您的具体情况下,您似乎希望每次评估n
,这意味着您需要将n
声明为def
,即:
def n = name.exists(_.isUpper)
这将创建一个无参数方法,每次调用n
时都会对其进行评估。