Dom*_*mra 6 scala implicit implicit-conversion
拿这个代码:
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
}
Run Code Online (Sandbox Code Playgroud)
我想这样使用它:
val x = register.getZeroFlag + 10
Run Code Online (Sandbox Code Playgroud)
但我受到了欢迎:
type mismatch; found : Boolean required: Int
Run Code Online (Sandbox Code Playgroud)
怎么了?我是否需要定义一个隐式的函数返回一个bool?
Kip*_*ros 14
这是一个演示如何使用implicits的示例:
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
}
Run Code Online (Sandbox Code Playgroud)
这里有两个可能不明显的事情:
Register
,编译器将查找伴随对象Register
.这就是为什么我们不需要reg2int
明确地将范围带入定义x
和y
.然而,转换bool2int
确实需要的范围,因为它没有定义Boolean
或Int
伴侣的对象.+
已在所有对象上定义为通过隐式any2stringadd
in 表示字符串连接scala.Predef
.该定义val z
是非法的,因为字符串连接的隐式优先于reg2int
(在伴随对象中发现的隐含优先级相对较低).但是,这个定义是val z2
有效的,因为我们已经reg2int
进入范围,给予它更高的优先级.有关编译器如何搜索implicits的更多详细信息,请参阅Daniel Sobral的非常好的解释:Scala在哪里查找implicits?
归档时间: |
|
查看次数: |
3391 次 |
最近记录: |