Łuk*_*ski 1 scala implicit-conversion
假设我有以下方法:
def main(args: Array[String]): Unit = {
println(Ring(2) + Ring(3) + Ring(-1) + Ring(10))
}
Run Code Online (Sandbox Code Playgroud)
产生:
([2] left->([-1] left-> null,right-> null),right->([3] left-> null,right->([10] left-> null,right->空值)))
我想写一个隐式转换,它允许我以下面的方式编写代码:
def main(args: Array[String]): Unit = {
val r :Ring = 2 + 3 + (-1) + 10
println(r)
}
Run Code Online (Sandbox Code Playgroud)
但是遵循隐式方法
implicit def intToRing(x :Int): Ring = {
new Ring(x)
}
Run Code Online (Sandbox Code Playgroud)
以这种方式工作首先它总结所有元素,然后创建Ring产生的东西:
([14] left-> null,right-> null)
是否有可能实现"非贪婪"的隐式转换,这将成为我想要的东西?
你应该能够通过显式地转换第一个Int来做到这一点:
val r = (2: Ring) + 3 + (-1) + 10
Run Code Online (Sandbox Code Playgroud)
这迫使编译器寻找一种方法来向a添加"3" Ring,这应该强制进行隐式转换,否则它可以愉快地使用整数加法而无需寻找隐式转换.
我能想到Ring的另一种方法是提供替代方法名称(直接或通过隐式包装类等),例如:
def +^(other: Ring): Ring = this + other
Run Code Online (Sandbox Code Playgroud)
并使用该运算符:
val r = 2 +^ 3 +^ (-1) +^ 10
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |