Котлин, как и 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 и, возможно, в некоторых других языках. Если имя, которое вы выберете, является незаконным, вам все равно понадобятся пометки.