Kotlin: pasar el método array to varargs con el operador spread

Pasé demasiado time tratando de resolver cómo pasar varias instancias de Migration a un generador de bases de datos de Room para un module Dagger2.

El constructor de la database Room requiere context y el nombre de la database.

 Room.databaseBuilder(context, Database::class.java, dbName) .build() 

Las migraciones se pueden agregar al generador con el método addMigrations que toma vararg migrations: Migration!

Una opción es crear el constructor.

 val builder = Room.databaseBuilder(context, Database::class.java, dbName) 

Y luego para cada uno a través de las migraciones

 migrations.forEach { builder.addMigrations(it) } 

sin embargo, esto es desorderado e innecesario, y el operador de propagación debería utilizarse en su lugar.

Me las arreglé de perder esto ya que la única documentation que encontré para el operador de propagación fue una sola oración en los documentos.

Cuando llamamos a una function vararg, podemos pasar arguments uno por uno, por ejemplo, como Lista (1, 2, 3) o, si ya tenemos una matriz y queremos pasar su contenido a la function, usamos la extensión operador (prefija la matriz con *)

Para pasar la matriz a la function. La matriz solo necesita el prefijo con un asterisco * .

 val migrations: Array<Migration> Room.databaseBuilder(context, Database::class.java, dbName) .addMigrations(*migrations) .build() 

En general, si tenemos

 fun foo(vararg things: Type) { //Do something with the things } 

Podemos llamar a foo con arrayOf o con una Array .

 foo(*Array(n, { it.toType()})) foo(*arrayOf(instance1, instance2, instance3)) val array = Array<Type>(n, {it.toType()}) foo(*array) 
  • Java Math como classs en Kotlin
  • ¿Por qué Kotlin no me deja usar la extensión writeText?
  • ¿Hay una manera simple de get un object por _id en Kotlin?
  • Usando un socket para un protocolo personalizado sobre tcp
  • La aplicación onCreate no se llama para las comstackciones de producción
  • ¿Por qué no puedo agregar dos numbers en Kotlin usando este código fuente?
  • Hibernate guarda la entidad hija con nulo ID padre
  • Errores de compilation con el nuevo kotlin 1.1, parameters de data binding kapt cant parse
  • Kotlin: classs actualizadas y selladas
  • Llamar a un constructor por defecto desde otro en Kotlin
  • Secuencia de destejido, idioma funcional / de transmisión de Kotlin