Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Kotlin中定义新运算符?_Kotlin - Fatal编程技术网

如何在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)