gpt4 book ai didi

scala - 我如何定义带有子特征的特征,以便它们的方法只采用共享实现?

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

我的元问题将是“我如何以可理解的方式提出这个问题?”但也许一个例子会更清楚:

trait Toolbox {
trait Bolt
trait Wrench {
def tighten(b : Bolt)
}

def getWrench : Wrench
def getBolt : Bolt
}


object MetricToolbox extends Toolbox {
...
}

object EnglishToolbox extends Toolbox {
...
}

当然,公制 Spanner 只能拧紧公制 bolt ;英文工具箱中的工具也是如此。我的问题是,我如何以类型安全的方式表达它,以便以下不会编译:
MetricToolbox.getWrench tighten EnglishToolbox.getBolt

但以下将:
def doTighten(box : Toolbox) = box.getWrench tighten box.getBolt

我知道这是可能的,因为我昨晚在 Scala 聚会上听到 Martin Odersky 亲口说这件事,但就在那一刻,我的妻子调用我的手机,我不得不在他解释之前匆匆离开房间。

编辑 Didierd 指出我的代码按编写的方式工作。他是对的——我对细节有点不清楚,但确实如此。自然的反向问题是,我怎么不这样做?答案非常简单:将这些类与主要特征放在同一级别。
trait Nail
trait Hammer {
def pound(n : Nail)
}

trait Toolbox {
trait Bolt
trait Wrench {
def tighten(b : Bolt)
}

def getWrench : Wrench
def getBolt : Bolt
def getNail : Nail
def getHammer : Hammer
}

MetricToolbox.getHammer pound EnglishToolbox.getNail // this DOES compile

最佳答案

正如所写,它已经可以工作了。如 BoltWrench嵌套在 Toolbox , Bolt输入 tighten 的参数表示 Bolt这个确切的工具箱,而不是 Bolt的任何工具箱。分别写成someToolbox.Bolt ,这意味着 Bolt确切的实例 someToolBoxToolbox#Bolt ,这意味着 Bolt在类型 Toolbox 中定义,无论实例工具箱。所以Toolbox#Bolt是所有 x.Bolt 的共同父类(super class)型.

这里Bolt无资质意味着this.Bolt , this作为封闭的工具箱。所以你不能混合。

关于scala - 我如何定义带有子特征的特征,以便它们的方法只采用共享实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8455345/

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