gpt4 book ai didi

scala - 构造一个可重写的隐式

转载 作者:行者123 更新时间:2023-12-02 04:42:00 25 4
gpt4 key购买 nike

我想为一个可以被覆盖的类实现一个泛型隐式。如下:

tooling.scala

package tooling    

case class Tool( msg: String)

class Toolkit{
def usingTool(source:String)(implicit tool:Tool){
println( s"[$source] using tool: ${tool.msg}" )
}
}

user.scala

package user

class User{
val toolkit = new Toolkit()

def usingGenericTool(){
toolkit.usingTool( "from generic usage")
}

def usingSpecificTool(){
implicit lazy val tool = Tool("shovel")
toolkit.usingTool( "from generic usage")
}
}

如果我在伴随对象或特征中定义通用隐式 Tool 实现,我会收到警告,tool 和通用隐式是模糊隐式值.

如何定义一个通用的隐式 val,它仍然可以在方法范围内被覆盖并在各种类中重用?

最佳答案

Tool的伴随对象中定义默认隐式:

case class Tool( msg: String)
object Tool {
implicit val defaultTool: Tool = Tool("Generic")
}

您可以通过导入其他工具或创建隐式 Tool 变量来覆盖它:

object Tools {
implicit val Special: Tool = Tool("special")
}

def usingTools(): Unit = {
val toolkit = new Toolkit()
toolkit.usingTool("using the default")

{ // importing an override
import Tools.Special
toolkit.usingTool("using imported")
}

{ // creating an override
implicit val anotherTool: Tool = Tool("local")
toolkit.usingTool("using local implicit val")

// using a Tool other then the currently imported as an exception:
toolkit.usingTool("overriding once manually")(Tool("manual"))
}
}

关于scala - 构造一个可重写的隐式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36518538/

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