El *
operador se conoce como el operador de propagación en Kotlin.
De la referencia de Kotlin ...
Cuando llamamos a una función vararg, podemos pasar argumentos uno por uno, por ejemplo, asList (1, 2, 3), o, si ya tenemos una matriz y queremos pasar su contenido a la función, usamos la extensión operador (prefijo la matriz con *):
Se puede aplicar a una matriz antes de pasarla a una función que acepte varargs
.
Por ejemplo...
Si tiene una función que acepta un número variado de argumentos ...
fun sumOfNumbers(vararg numbers: Int): Int {
return numbers.sum()
}
Puedes pasarle una matriz así ...
val numbers = intArrayOf(2, 3, 4)
val sum = sumOfNumbers(*numbers)
println(sum) // Prints '9'
Notas:
- El
*
operador también es el operador de multiplicación (por supuesto).
- El operador solo se puede usar al pasar argumentos a una función. El resultado de la operación no se puede almacenar porque no arroja ningún valor (es azúcar puramente sintáctico).
- El operador puede confundir a algunos programadores de C / C ++ al principio porque parece que se está quitando la referencia a un puntero. No lo es; Kotlin no tiene noción de punteros .
- El operador se puede utilizar entre otros argumentos cuando se llama a una función vararg. Esto se demuestra en el ejemplo aquí .
- El operador es similar a la
apply
función en varios lenguajes de programación funcional.
Además de las respuestas que fueron directamente hacia "¿¡qué es esto!?!", A menudo tiene el caso en el que tiene un
List
y desea pasarlo a una función que espera unvararg
. Para esto, la conversión es:Suponiendo que el último parámetro de
someFunc
esvararg
del mismo tipo que los elementos de la lista.fuente
Como se describe en la documentación, este es un operador de propagación:
fuente
Si una función que acepta un parámetro vararg (número variable de argumentos) como:
Ahora para llamar a este método, podemos hacer:
Pero, ¿qué pasa si tenemos estos valores en una matriz, como:
luego, para llamar a este método tenemos que usar el operador de propagación, como:
Aquí, * (operador de propagación) pasará todo el contenido de esa matriz.
Pero espere un minuto, ¿qué pasa si lo llamamos así?
sum(array)
Nos dará un error de tiempo de compilación de Type Mismatch:El problema es que la
sum
función acepta unvararg Int
parámetro (que acepta un valor como: 1,2,3,4,5) y si pasamos una matriz, se pasará comoIntArray
.fuente
En Java, puede pasar una matriz como está, pero una ventaja de desempaquetar una matriz con el operador de extensión
*
es que el operador de extensión le permite combinar los valores de una matriz y algunos valores fijos en una sola llamada. Java no admite esto.fuente
val resultOne = arrayOf(intArrayOne, intArrayTwo)
yval resultTwo = arrayOf(*intArrayOne, *intArrayTwo)
. Tipo deresultOne
yresultTwo
son respectivamenteArray<Int>
yArray<Array<Int>>
. Creo que esa es una de las razones