Kotlin не может выполнять операции с целым массивом «из коробки», но вы можете легко выполнить их, предварительно определив несколько функций расширения. Например:
operator fun Double.times(array: DoubleArray)
= DoubleArray(array.size){ this * array[it] }
operator fun DoubleArray.plus(other: DoubleArray): DoubleArray {
require(size == other.size)
return DoubleArray(size){ this[it] + other[it] }
}
Определяет перегрузки для операторов +
и *
для комбинаций Double
/ DoubleArray
, что позволяет писать код, например:
fun main() {
val array1 = DoubleArray(10){ it.toDouble() }
val array2 = DoubleArray(10){ it.toDouble() * 2 }
val array3 = 10.0 * array1 + 20.0 * array2
println(array3.joinToString())
}
Возможно, вы захотите определить аналогичные функции расширения для умножения, где скаляр идет вторым, вычитание массивов, деление на скаляр и тоже c, но я уверен, что вы видите, как они будут работать.
Проверка require()
дает IllegalArgumentException
во время выполнения, если вы пытаетесь добавить два массива разной длины. (Нет простого способа проверить это во время компиляции.)
(Есть небольшая хитрость в том, что уже есть оператор +
для массивов, но он объединяет их вместо выполнения арифметики c. К счастью, определение нашего здесь отменяет это.)