La palabra clave vararg en Kotlin permite a una función aceptar un número variable de argumentos. Esto es equivalente a los arrays en Java, pero con un azúcar sintáctico adicional.
Reglas y restricciones:
fun foo(vararg numbers: Int)vararg debe ser el último entre los parámetros de la función (si hay parámetros después de él, deben ser nombrados al llamarlo).*).vararg sin pasar valores para ese argumento.fun printAll(vararg strings: String) { for (s in strings) println(s) } val arr = arrayOf("a", "b", "c") printAll("one", "two") // funcionará printAll(*arr) // spread (despliega el array)
¿Se puede declarar dos parámetros 'vararg' en una misma función o colocar 'vararg' no último?
Respuesta: No, en Kotlin solo se puede usar un vararg en la declaración de la función, siempre debe ser el último en los argumentos posicionales. Si se agrega un parámetro normal después de él, solo se puede pasar por nombre.
Ejemplo:
fun foo(vararg items: String, prefix: String) // ¡Error de compilación! // Correcto: fun foo(vararg items: String, vararg items2: Int) // ¡Error de compilación! // Funciona: fun foo(vararg items: String, prefix: String = "[default]") foo("a", "b", prefix = "->")
Historia
Un joven programador creía erróneamente que se podían declarar dos parámetros vararg a la vez. La arquitectura de la función se construyó de tal manera que la separación estaba en varios niveles de llamada. Esto llevó a una cadena de refactorizaciones: fue necesario revisar la lógica de los datos recibidos y reescribir todas las llamadas.
Historia
En un proyecto de Android, olvidaron usar el operador spread * al pasar un array a una función con el parámetro vararg: printAll(arr) en lugar de printAll(*arr). Como resultado, en lugar de imprimir los elementos, el array se imprimió como una sola cadena con la dirección del objeto, haciendo que la aplicación se comportara de manera extraña.
Historia
En una función con vararg y parámetros nombrados adicionales fun foo(vararg a: Int, b: Int), las llamadas mediante argumentos posicionales fueron interpretadas incorrectamente: el compilador no pudo determinar dónde termina la lista para vararg y dónde comienza el argumento b, lo que llevaron a errores de tiempo de compilación. Decidieron usar explícitamente los nombres de los argumentos para tales parámetros.