【问题标题】:Kotlin: pass array to varargs method with spread operatorKotlin:使用扩展运算符将数组传递给可变参数方法
【发布时间】:2017-07-10 20:13:42
【问题描述】:

我花了很长时间试图弄清楚如何将多个 Migration 实例传递给 Dagger2 模块的 Room 数据库构建器。

Room 数据库构建器需要上下文和数据库名称。

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

可以使用addMigrations 方法将迁移添加到构建器,该方法采用vararg migrations: Migration!

一种选择是创建构建器。

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

然后 forEach 通过迁移

migrations.forEach { builder.addMigrations(it) }

然而这是混乱且不必要的,应该使用扩展运算符。

我设法错过了这一点,因为我为展开运算符找到的唯一文档是文档中的一个句子。

当我们调用一个可变参数函数时,我们可以一个接一个地传递参数,例如asList(1, 2, 3),或者,如果我们已经有一个数组并且想要将其内容传递给函数,我们使用扩展运算符(以 * 为数组前缀)

【问题讨论】:

标签: kotlin dagger-2 android-room


【解决方案1】:

为了将数组传递给函数。该数组只需要以星号 * 为前缀。

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

一般来说,如果我们有

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

我们可以使用arrayOfArray 致电foo

foo(*Array(n, { it.toType()}))
foo(*arrayOf(instance1, instance2, instance3))
val array = Array<Type>(n, {it.toType()})
foo(*array)

【讨论】:

  • 文档已经提到传播运算符herehere。所以在这里发布是不必要的。
  • 我看到了第二个链接。我一直在寻找但最初没有看到的是像stackoverflow.com/documentation/kotlin/5835/… 这样的解释,它解释了价差在做什么,而不仅仅是说“在你的论点之前加上一个星号”。我还想知道使用运算符是否有特定原因,而不是自动扩展传递给可变参数方法的任何数组。
  • 您好,在第二个链接的底部有一个关于asList 的演示。 :)
  • 我确实看到了。考虑运算符的原因,我想如果我有 vararg things: Any 并将数组传递给它,不清楚该数组是单个参数,还是数组内容是单个参数,这就是为什么显式 @987654333 @ 运算符是必需的。感谢您的帮助。
  • 嗨,asList 函数签名已经告诉您,它将所有数组元素一一传播到参数中。简而言之:arrayOf(1,*arrayOf(2),3) 等价于 arrayOf(1,2,3)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多