operand1 = value-6ren">
gpt4 book ai didi

kotlin - 什么是 Kotlin 指数运算符

转载 作者:IT老高 更新时间:2023-10-28 13:31:35 34 4
gpt4 key购买 nike

Kotlin 中的指数运算符是什么。我以为它会是 ** 但它似乎在我的代码中抛出了一个错误。

when (pendingOperation) {
"=" -> operand1 = value
"÷" -> operand1 = if (value == 0.0) {
Double.NaN // handle attempt to divide by zero
} else {
operand1!! / value
}
"x" -> operand1 = operand1!! * value
"−" -> operand1 = operand1!! - value
"+" -> operand1 = operand1!! + value
"a^b" -> operand1 = operand1!! ** value

最佳答案

Kotlin 和 Java 一样,没有指数运算符。 Java 有 Math.pow,您也可以将其与 Kotlin 一起使用,但 Kotlin 也有 Float 和 Double 的扩展函数,您可以使用它们。

如果您需要将指数与 Ints 或 Longs 一起使用,您只需转换为 double 并在之后转换回 int/long。或者,您可以创建自己的方法。

它非常简单,因为它是一个扩展函数;只需在 DoubleFloat 对象上调用 .pow:

"a^b" -> operand1 = operand1!!/*.toDouble()*/.pow(value)/*.toInt()*/
//Not sure what type operand1 is, so the comments are there if it's not a double or float, and the second assumes it's an int

注意:由于limitations of DEX ,此答案的其余部分不适用于 Android。请改用 .pow()Math.pow()。这仍然适用于 JVM(可能是 Kotlin Native),但不适用于 Android。


但是,您可以创建一些中缀函数来获得一个。这里的想法是使用 Kotlin 名称的转义字符来创建 Python 风格的指数运算符。转义字符是 meant to escape Java functions with names colliding with Kotlin keywords ,但它们带来了很多乐趣。例如,您可以使用带空格的名称,假设您将其包装在反引号 (`) 中。

您也可以完全从头开始编写自己的幂函数,但请注意,Math.pow() 的实现是用 C++ 编写的,并且很可能比用 Kotlin 编写的更快,或者Java。

/**
* Integer power using [Double.pow]
*/
infix fun Int.`**`(exponent: Int): Int = toDouble().pow(exponent).toInt()

/**
* Long power using [Double.pow]
* Note: it may be preferable to use a BigInteger instead of toDouble()
* to prevent a loss of precision - use whichever makes sense
* for the number you have at hand, and the precision you need.
*/
infix fun Long.`**`(exponent: Int): Long = toDouble().pow(exponent).toLong()
// infix fun Long.`**`(exponent: Int): Long = toBigInteger().pow(exponent).toLong()

/**
* Double power using [Double.pow]
*/
infix fun Float.`**`(exponent: Int) : Float = this.pow(exponent)

/**
* Float power using [Float.pow]
*/
infix fun Double.`**`(exponent: Int) : Double = this.pow(exponent)

允许您调用:

val x = 10
val exponent = 2
println(x `**` exponent)
assertEquals(x `**` exponent, 100)

注意反引号(``)。正如我之前提到的,在 Kotlin 中,当函数、变量、类或其他内容包含 Kotlin 关键字时,它们旨在转义 java 调用。例如,如果我在 Java 中声明了一个 boolean is() 并想从 Kotlin 中调用它,我必须将它称为 ContainingClass.`is`

但是,它们不限于在调用 Java 函数或变量时使用。您可以将它们用作实际的变量或函数名称。 IE。 var `this` 可以是变量名,但必须作为 `this` 调用/取消引用。

这是完全有效的代码:

var `this` = 32
`this` += 10;
print(`this`)

... 但是如果你在一个类中运行它,并使用 print(this) 而不是 print(`this`),你会打印出结果类的 toString() 方法而不是 42。

此外,反引号并不关心逃逸的内容。不管有没有 Kotlin 关键字,一切都被转义了。你可以有空格、符号、表情符号(这样你终于可以拥有你一直想要的 val `😂` = 42;)、关键字......这就是我在函数声明中使用的.通过用转义字符声明它,它使通常非法的名称合法,大概是因为它被解释为原始字符串。我不完全确定它在引擎盖下是如何工作的,但使用时并不重要。除了与基于 Java 的库进行交互之外,它们实际上很少有真正的用途,但也有很多乐趣。

使函数起作用的第二部分是 infix 关键字。如果您不知道 infix 关键字是什么,它可以调用不带句点和括号的函数。在这里使用它的原因是使 x `**` exponent 成为一个实际有效的函数调用 - 没有它,代码将是 field.`**`(2) .您可以阅读有关中缀函数的更多信息 in the documentation

你也可以选择一个不同的名字来去掉反引号——我只使用了 **,主要是因为它类似于 Python。它也用在 JavaScript 和可能的其他一些语言中。其他非法名称也可以通过使用反引号来选择。

关于kotlin - 什么是 Kotlin 指数运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50270435/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com