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) 
  • Async no espera a la espera
  • Kotlin: Scoping usando Object vs Class
  • Jerarquía de nodo de la list de routes de directory
  • Validación del método Hibernate
  • Método modificado con nueva condición
  • No se esperan arguments de tipo para la diversión findViewById (p0: Int): Ver
  • Interoperabilidad de reflexión de Kotlin con Java
  • ¿De qué se trata este package "KotlinRulezzz"?
  • ¿Es posible inyectar en campo un adaptador de vista de reciclador con Dagger 2.11
  • Extienda la interfaz paramétrica de Java de Kotlin
  • Cómo mostrar un solo artículo seleccionado en recyclerview usando kotlin