ProgramaciónDesarrollador de Kotlin

¿Cómo funciona 'vararg' en Kotlin? Describe las reglas de paso, restricciones, interacción con patrones comunes y las dificultades típicas al combinarlo con argumentos nombrados y normales.

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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:

  • Sintaxis estándar: fun foo(vararg numbers: Int)
  • El argumento 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).
  • Se pueden pasar tanto valores individuales como un array (usando el operador spread *).
  • Se puede llamar a una función con vararg sin pasar valores para ese argumento.

Ejemplo de código

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)

Pregunta trampa.

¿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 = "->")

Ejemplos de errores reales debido a la falta de conocimiento sobre los detalles del tema.


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.