A T*_*A T 9 scala operator-overloading operators pow scala-2.10
我非常喜欢许多语言(例如Python)的**语法pow.
是否可以将其引入Scala,而无需修改Scala"基础"代码?
我的尝试Int只有一个:
import scala.math.pow
implicit class PowerInt(i: Int) {
def `**`(n: Int, b: Int): Int = pow(n, b).intValue
}
Run Code Online (Sandbox Code Playgroud)
Swa*_*yam 15
这个答案迟了2年,仍然为了其他人的利益,我想指出所接受的答案不必要地延伸到AnyVal.
只有一个小错误需要在原始答案中修复.该def **方法只需要一个参数,即指数作为基础已经在构造函数中传递,而不是原始代码中的两个.修复并删除反引号会导致:
import scala.math.pow
implicit class PowerInt(i: Int) {
def ** (b: Int): Int = pow(i, b).intValue
}
Run Code Online (Sandbox Code Playgroud)
其作品如预期看到这里.
只有在未定义调用它的方法时,Scala编译器才会转换Int为a .这就是你不需要从AnyVal扩展的原因.PowerInt
在幕后,Scala查找一个隐式类,其构造函数参数类型与转换对象的类型相同.由于对象只能有一个类型,因此隐式类在构造函数中不能有多个参数.此外,如果您使用相同的构造函数类型定义两个隐式类,请确保它们的函数具有唯一的签名,否则Scala将不知道要转换到哪个类并且会抱怨歧义.
Ste*_*nze 14
这对我有用:(问题#1 pow在双打中定义,问题#2扩展为anyval)(也没有意义在方法名中有这些反引号?)
import scala.math.pow
object RichIntt {
implicit class PowerInt(val i:Double) extends AnyVal {
def ** (exp:Double):Double = pow(i,exp)
}
def main(args:Array[String])
{
println(5**6)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13141 次 |
| 最近记录: |