Что такое оператор экспоненты Котлина

Что представляет собой оператор экспоненты в Котлине. Я предположил, что это будет ** но, похоже, это вызывает ошибку в моем коде.

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

Ответ 1

Котлин, как и Java, не имеет оператора экспоненты. В Java есть Math.pow, который вы также можете использовать с Kotlin, но Kotlin также имеет функции расширения для Float и Double, которые вы можете использовать вместо этого.

Если вам нужно использовать экспоненты с Ints или Longs, вы просто конвертируете в double и потом возвращаетесь в int/long. В качестве альтернативы вы можете создавать свои собственные методы.

Это довольно просто, так как это функция расширения; просто вызовите .pow для объекта Double или Float:

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

Тем не менее, вы можете создать некоторые инфиксные функции, чтобы получить их. Идея здесь заключается в использовании escape-символов для имен Kotlin для создания оператора экспоненты в стиле Python. Самостоятельно создавать код для метода pow не очень хорошая идея, если только вы не знаете, что делаете.

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

/**
 * Long power using [Double.pow]
 */
infix fun Long.'**'(exponent: Int): Long = toDouble().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 они используются для экранирования ключевых слов и других "недопустимых" имен и использования их в качестве фактических имен переменных или функций. Т.е. var 'this' может быть именем переменной, но должно называться 'this'.

Если вы не знаете, что такое ключевое слово infix, оно позволяет вызывать функции без точек и скобок. Причина, по которой он здесь используется, состоит в том, чтобы сделать x '**' exponent действительным действительным вызовом функции - без него это могло бы быть field.'**'(2). Вы можете прочитать больше о инфиксных функциях в документации

Вы также можете выбрать другое имя, чтобы избавиться от обратных кавычек - я просто использовал **, в основном потому, что он похож на Python. Он также используется в JavaScript и, возможно, в некоторых других языках. Если имя, которое вы выберете, является незаконным, вам все равно понадобятся пометки.

Ответ 2

использовать метод расширения pow

inline fun Double.pow(x: Double): Double (source)

для более подробной информации pow