gpt4 book ai didi

scala - 为什么val和def实现抽象方法的时间不同?

转载 作者:行者123 更新时间:2023-12-04 19:31:28 26 4
gpt4 key购买 nike

我正在使用 scala 并做了这样的事情:

trait Foo { val a: String }
trait Foo2 extends Foo { val a = "foo" }
trait Bar extends Foo { val b = a + "-bar" }
object Bar2 extends Bar with Foo2

我预计 Bar2.b 会是“foo-bar”,但它最终变成了“null-bar”。 Bar2.a 是预期的“foo”。

如果我将 'a' 的定义从 val 更改为 def,如下所示:

trait Foo { def a: String }
trait Foo2 extends Foo { val a = "foo" }
trait Bar extends Foo { val b = a + "-bar" }
object Bar2 extends Bar with Foo2

Bar2.b 实际上是“foo-bar”。

在示例 2 中,Foo2 中的 def 'a' 实现了 Foo 中的抽象对象,在评估 val 'b' 之前被放入 Bar2 的定义中。在示例 1 中,在 Bar/Bar2 中定义了 val 'b' 之后,来自 Foo2 的 val 'a' 覆盖了来自 Foo 的 val 'a'。

为什么会这样?为什么val和def实现抽象方法的时间不同?

最佳答案

您总是希望在特征中使用 deflazy val(而不仅仅是 val)以避免您发现的尴尬行为。

至于为什么,这涉及到 Scala 在 JVM 中实现的底层细节,请查看 Josh Suereth 的精彩演讲 "Binary Resilience"来自 2012 年 Scala 日。

关于scala - 为什么val和def实现抽象方法的时间不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20914777/

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