gpt4 book ai didi

scala - 如何将特征声明为隐式 "constructor parameters"?

转载 作者:行者123 更新时间:2023-12-03 07:41:18 26 4
gpt4 key购买 nike

我正在设计一个类层次结构,它由一个基类和几个特征组成。基类提供了几种方法的默认实现,特征通过抽象覆盖选择性地覆盖某些方法,从而充当可堆叠的特征/混合。

从设计角度来看,这效果很好,并且映射到域,以便我可以从这里添加过滤函数(一个特征),并使用这里的谓词(另一个特征)等。

但是,现在我希望我的一些特征能够采用隐式参数。我很高兴这从设计角度来看仍然有意义,并且在实践中不会造成困惑。但是,我无法说服编译器使用它运行。

问题的核心似乎是我无法为特征提供构造函数参数,以便它们可以被标记为隐式。在方法实现中引用隐式参数无法编译,并出现预期的“无法找到隐式值”消息;我尝试将隐式从构造阶段(实际上,它始终在范围内)“传播”到方法中可用

implicit val e = implicitly[ClassName]

但是(毫无疑问,正如你们中的许多人所期望的那样)定义失败并出现相同的消息。

看来这里的问题是我无法说服编译器使用隐式ClassName标志来标记特征本身的签名,并强制调用者(即那些将特征混合到一个对象)来提供隐含的。目前我的调用者正在这样做,但编译器并未在此级别进行检查。

<小时/>

是否有任何方法可以将特征标记为需要在构造时提供某些隐含项?

(如果没有,这是否还没有实现,或者是否有更深层次的原因导致这不切实际?)

最佳答案

其实我以前也经常有这样的想法,但只是想出了这个主意。你可以翻译

trait T(implicit impl: ClassName) {
def foo = ... // using impl here
}

至[已编辑:原始版本未提供对其他方法的隐式访问]

trait T {
// no need to ever use it outside T
protected case class ClassNameW(implicit val wrapped: ClassName)

// normally defined by caller as val implWrap = ClassNameW
protected val implWrap: ClassNameW

// will have to repeat this when you extend T and need access to the implicit
import implWrap.wrapped

def foo = ... // using wrapped here
}

关于scala - 如何将特征声明为隐式 "constructor parameters"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6983759/

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