【问题标题】:Correct way of declaring arrays using the Array() constructor?使用 Array() 构造函数声明数组的正确方法?
【发布时间】:2018-10-27 11:33:49
【问题描述】:

我知道Array() 构造函数接受两个参数:数组的大小和一个接收数组索引并返回该索引值的函数。

我在 kotlinlang.org 在线 IDE 中编写了一些示例程序,并声明并初始化了我的数组:

var array = Array(9, {i -> ' '})

一个大小为 9 的“空白”字符数组,完全用空格填充。这在 kotlinlang.org 编译器中运行良好,并且运行良好;但是,当我尝试将相同的代码导入 IntelliJ-IDEA 时,我收到以下警告:

警告:Kotlin:参数 'i' 从未使用过,可以重命名为 _

下划线字符是什么意思?它如何充当索引?将 i 重命名为 _ 确实会删除警告,但它到底有什么作用呢?

我应该如何正确使用Array() 构造函数来使用 lambda 表达式初始化数组? 请记住,我知道 lambda 表达式可以写在方括号之外,但我还是选择包含它,因为它非常简单。

提前致谢。

【问题讨论】:

  • 它向读者表明从未使用过此参数。

标签: arrays intellij-idea lambda kotlin


【解决方案1】:

它说的是“警告”而不是“错误”。

Warning: Kotlin: Parameter 'i' is never used, could be renamed to _

代码编译正常,只是通知你可以将未使用的 lambda 参数重命名为 _ 以更明显地表明未使用 lambda 参数。

所以,为了回答您的问题,您已经正确构建了数组。但是,如果出于某种原因您想使用索引来构造数组,您可以将其命名并使用它在 lambda 内部进行计算,该 lambda 为构造数组的每个元素而执行。例如:

val array = Array(10, { i -> i * 10  })

这将导致如下数组:

[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

另外,需要注意的是,您使用了var,这意味着您的变量array 是可变的(即可以重新分配整个变量)。这可能不是你想要的,所以你应该支持val,除非你特别想要一个可变变量。

【讨论】:

  • 我明白了。这很有意义。谢谢。
  • 在这种情况下,请投票并接受它作为答案
【解决方案2】:

这只是一个警告。

在 Kotlin 中,如果您不使用参数,您可以将其重命名为 _。它更具可读性。 在您的情况下,您不要在 lambda 函数的右侧使用 i 。所以可以重命名为_

【讨论】:

    【解决方案3】:

    正如其他答案所说,您的代码是正确的,但由于您没有使用参数i,因此无需为其命名。您可以改用 _,它只是一个占位符:它向 Kotlin 表明 lambda 接受一个参数,但您并不关心它。

    (下划线在这里可能看起来不是很有用,但它可以在更复杂的情况下提供帮助。例如,如果您有一个包含许多字段的大型 Person 类,您可以只使用其中几个字段,例如 for ((name, _, _, age) in persons)... )

    实际上,您可以进一步简化表达式!与更传统的块结构语言不同,在 Kotlin 中,大括号通常表示 lambda(除了函数体、ifwhen 分支等情况),即使没有 ->。在这里,Kotlin 可以推断出参数的数量和类型。因此,您可以完全删除参数和箭头,只需使用:

    var array = Array(9, {' '})
    

    【讨论】:

      【解决方案4】:

      以下所有定义都创建相同的数组。 Kotlin(和 IntelliJ)不鼓励冗余代码,所以 _i“更好”(因为 i 没有被使用)并且“nothing”比 _ 更好。最后,IntelliJ 鼓励最后一个参数 lambda 位于单独的块中 - 根据第四个示例:

      Array(9, { i -> ' ' })
      Array(9, { _ -> ' ' })
      Array(9, { ' ' })
      Array(9) { ' ' }
      

      【讨论】:

        猜你喜欢
        • 2013-05-02
        • 1970-01-01
        • 2014-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多