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