gpt4 book ai didi

scala - 覆盖值的行为的原理

转载 作者:行者123 更新时间:2023-12-04 13:34:23 25 4
gpt4 key购买 nike

class A { 
val x = println("A")
}
class B extends A {
override val x = println("B")
}
(new B).x

打印:
A
B

然而,
class A { 
lazy val x = println("A")
}
class B extends A {
override lazy val x = println("B")
}
(new B).x

仅打印:
B

According to Martin Odersky至少在非惰性情况下是“指定的”行为。我很好奇为什么以这种方式指定行为,以及为什么在val懒惰时行为有所不同。

最佳答案

类定义的模板(“body”)中的代码(在成员定义之外)是构造函数的内容。初始化子类的实例时,始终会调用父类的构造函数(在这种情况下,您将调用不带参数的构造函数,否则语法为class B extends A(arg1, arg2) { ... })。有关更多详细信息,请参见Scala Language Specification中的第5.1节。

这就是为什么在第一种情况下评估println("A")的原因; val定义是构造函数代码的一部分。

在第二个示例中,当您考虑在构造时会发生什么时,您从未询问过x中定义的A的值;现在,因为它是lazy val,所以在需要它之前不会对其进行计算。

您可以将lazy val视为不带任何参数并且在第一次调用它们时将其输出缓存的方法。您没有在这里调用该方法,而是对其进行了定义。

关于scala - 覆盖值的行为的原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7684590/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com