如何在Kotlin中定义新运算符?
是否可以定义一个通用的求幂运算符,其接口如下:如何在Kotlin中定义新运算符?,kotlin,Kotlin,是否可以定义一个通用的求幂运算符,其接口如下: > 10^3 // 1000 > 2.71^2 // 7.3441 > 3.14^(-3.14) // 0.027.. var k=2 ... println((k v 5)+3) 根据文档,可以使用中缀函数扩展类: // Define extension to Int infix fun Int.exp(exponent: Int): Int { ... } var k=2 ... pr
> 10^3 // 1000
> 2.71^2 // 7.3441
> 3.14^(-3.14) // 0.027..
var k=2
...
println((k v 5)+3)
根据文档,可以使用中缀函数扩展类:
// Define extension to Int
infix fun Int.exp(exponent: Int): Int {
...
}
var k=2
...
println((k v 5)+3)
但是它们不允许像
^
否这样的符号。Kotlin只允许重载预定义的操作符集,如中所示。而且^
不是其中之一(它甚至不是一个操作符,因此不能重载)。不幸的是,您无法定义新的操作符,只能重载其中的一个操作符。稍后可能会将一些操作员添加到该集合中,Kotlin问题跟踪程序中有一个用于该集合的选项
var k=2
...
println((k v 5)+3)
但是,您可以使用反勾选的名称来定义类似于运算符的中缀
扩展函数(但不太美观):
var k=2
...
println((k v 5)+3)
用法:
5 `^` 3
var k=2
...
println((k v 5)+3)
请注意,infix
函数的优先级低于运算符的优先级,因此
1 + 1 `^` 3 == 8
var k=2
...
println((k v 5)+3)
我从事数学工作。Android Studio禁止使用带引号的^
。
所以我定义了v
操作符(^
倒置)。它难看吗?是的,但它比
类型转换和pow
符号的thons
inline infix fun Double.v(exponent: Int): Double = this.pow(exponent)
inline infix fun Double.v(exponent: Long): Double = this.pow(exponent.toDouble())
inline infix fun Double.v(exponent: Double): Double = this.pow(exponent)
inline infix fun Int.v(exponent: Int): Double = this.toDouble().pow(exponent)
inline infix fun Int.v(exponent: Long):
Double = this.toDouble().pow(exponent.toDouble())
inline infix fun Int.v(exponent: Double): Double = this.toDouble().pow(exponent)
inline infix fun Long.v(exponent: Int): Double = this.toDouble().pow(exponent)
inline infix fun Long.v(exponent: Long):
Double = this.toDouble().pow(exponent.toDouble())
inline infix fun Long.v(exponent: Double):
Double = this.toDouble().pow(exponent)
var k=2
...
println((k v 5)+3)
inline
使用在运行时不会产生额外的负载,即使在较重的循环中也是如此
var k=2
...
println((k v 5)+3)
不幸的是,受损的运算符优先级迫使您用括号包围幂运算。编译器会强制你在两侧加空格
var k=2
...
println((k v 5)+3)
毕竟,什么才是最好的外观
var k=2
...
println((k v 5)+3)
这个
var k=2
...
println((k v 5)+3)
还是这个
var k=2
...
println((k v 5)+3)
var k=2
...
println(k.toDouble().pow(5) + 3)
我对第一个选项投票 另外,即使可以定义指数运算符,我也建议不要使用
^
。在爪哇、C等许多语言中,<代码> ^ < /代码>运算符执行,所以在Kotlin做一些不同的事情会令人惊讶。是的,<代码> ** /代码>可能是更安全的选择。所有这些,但“幸运的”,我希望他们考虑考虑添加一个幂算符,因为它被广泛应用于任何一种数学。代码>数学.pow在我看来有点笨重。太棒了!那么这个呢?内联中缀fun T.v(exponent:T):Double=this.toDouble().pow(exponent.toDouble())是的!你是对的。好主意。我会修改代码的。
var k=2
...
println((k v 5)+3)