gpt4 book ai didi

scala - Scala隐式转换范围问题

转载 作者:行者123 更新时间:2023-12-04 13:28:50 24 4
gpt4 key购买 nike

采取以下代码:

  class Register(var value:Int = 0) {
def getZeroFlag() : Boolean = (value & 0x80) != 0
}

object Register {
implicit def reg2int(r:Register):Int = r.value
implicit def bool2int(b:Boolean):Int = if (b) 1 else 0
}

我想这样使用它:
val x = register.getZeroFlag + 10

但我受到欢迎:
type mismatch; found : Boolean required: Int

怎么了我需要定义一个返回 bool 值的隐式函数吗?

最佳答案

这是一个演示如何使用隐式的示例:

object Test {
val register = new Register(42)
val x = 1 + register // implicitly calling reg2int from companion object
val y = register - 1 // same
// val z = register + 1 // doesn't work because "+" means string concatenation

// need to bring bool2int implicit into scope before it can be used
import Register._
val w = register.getZeroFlag() + 2 // this works now
val z2 = register + 1 // works because in-scope implicits have higher priority
}

这里有两个潜在的非显而易见的事情:
  • 在寻求与Register类型的对象之间的隐式转换时,编译器将查找伴随对象Register。这就是为什么我们不需要将reg2int明确纳入定义xy的范围的原因。但是,转换bool2int确实需要在范围内,因为它不是在BooleanInt伴随对象上定义的。
  • 已经在所有对象上定义了+方法,以通过any2stringadd中的隐式scala.Predef表示字符串连接。定义val z是非法的,因为字符串连接的隐式优先于reg2int(在伴随对象中发现的隐式优先级相对较低)。但是,定义val z2起作用是因为我们将reg2int纳入了范围,使其具有更高的优先级。

  • 有关编译器如何搜索隐式函数的更多详细信息,请参见Daniel Sobral的很好的解释: Where does Scala look for implicits?

    关于scala - Scala隐式转换范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6906742/

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