Что такое оператор экспоненты Котлина? - PullRequest
0 голосов
/ 10 мая 2018

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

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

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

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

Если вам нужно использовать экспоненты со значениями Ints или Long, вы просто конвертируете в 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's not a double or float, and the second assumes it's 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 и, возможно, в некоторых других языках. Если имя, которое вы выберете, является незаконным, вам все равно понадобятся пометки.

0 голосов
/ 10 мая 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...