gpt4 book ai didi

scala - Cake Pattern 中显式类型的自引用的用处

转载 作者:行者123 更新时间:2023-12-04 11:56:25 26 4
gpt4 key购买 nike

似乎 Scala 的 explicitly-typed self references 最常见的用法位于“Cake pattern ”中,其中模块的依赖项声明如下:

class Foo { this: A with B with C =>
// ...
}

一般来说,暂时忽略蛋糕图案, A , BC可以引用任何类型级别的东西,例如类型参数:
class Outer[A, B, C] {
class Inner { this: A with B with C =>
// ...
}
}

...或抽象类型成员:
class Outer {
type A
type B
type C
class Inner { this: A with B with C =>
// ...
}
}

在这两种情况下,我们都不能写 abstract class Inner extends A with B with C , 因为 A , BC不知道是特征。这里需要显式类型的自引用。但是,我只见过带有特征的蛋糕图案:
trait A { def a }
trait B { def b }
trait C { def c }
class Foo { this: A with B with C =>
// ...
}

在这种情况下,我们可以改为 abstract class Foo extends A with B with C直接,如果我没记错的话,意思是一样的。我对么?如果不是,那么它们有何不同;如果是这样,为什么每个人似乎都使用显式类型的自我引用?

最佳答案

我似乎忽略了两个主要区别:

  • 尽管显式的自类型注释和简单的 extends关键字描述了两种类型之间的“is-a”关系,在前一种情况下,这种关系在外部是不可见的:
    scala> trait T
    defined trait T

    scala> class C { this: T => }
    defined class C

    scala> implicitly[C <:< T]
    <console>:10: error: Cannot prove that C <:< T.

    这是一件好事,因为在蛋糕模式中,您不希望您的“模块”对象在不经意间被多态地用作它所依赖的特征之一。
  • As noted explicitly by Mushtaqindirectly by Daniel ,当使用自类型注解时,依赖关系可以是循环的。循环依赖很常见,而且不一定是坏事(假设相互依赖的组件不需要彼此进行初始化,或者我们可以在它们之间以某种方式tie the knot),所以这是自类型注释相对于继承的另一个明显好处。
  • 关于scala - Cake Pattern 中显式类型的自引用的用处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11462748/

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