我知道Array()
构造函数接受两个参数:数组的大小和一个函数,该函数接收数组的索引并返回该索引的值。
我已经在kotlinlang.org在线IDE中编写了一些示例程序,并这样声明和初始化了我的数组:
var array = Array(9, {i -> ' '})
大小为9的“空白”字符数组,完全用空格填充。这在kotlinlang.org编译器中可以正常工作,并且运行良好;但是,当我尝试将相同的代码导入IntelliJ-IDEA时,出现以下警告:
警告:Kotlin:从未使用参数'i',可以将其重命名为_
下划线字符是什么意思?它如何充当索引?将i
重命名为_
确实会删除警告,但是它的作用是什么?
如何正确使用Array()
构造函数使用lambda表达式初始化数组? 请记住,我知道lambda表达式可以写在方括号之外,但是我还是选择包含它,因为它非常简单。
谢谢。
答案 0 :(得分:0)
它说的是“警告”而不是“错误”。
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
。
答案 1 :(得分:0)
这只是一个警告。
在Kotlin中,如果您不使用参数,则可以将其重命名为_
。它更具可读性。
对于您而言,请勿在lambda函数的右侧使用i
。因此,您可以将其重命名为_
答案 2 :(得分:0)
正如其他答案所述,您的代码是正确的,但是由于您没有使用参数i
,因此无需为其命名。您可以改为使用_
,它只是一个占位符:它向Kotlin表示lambda接受参数,但是您并不在意。
(下划线在这里似乎不太有用,但是可以在更复杂的情况下提供帮助。例如,如果您有一个包含多个字段的大型Person类,则可以仅将其中几个与{{1} }…)
实际上,您可以进一步简化表达式!与更传统的块结构语言不同,在Kotlin中,大括号通常表示一个lambda(在函数体以及for ((name, _, _, age) in persons)
和if
分支等情况下除外),即使没有when
也是如此。在这里,Kotlin可以推断参数的数量和类型。因此,您可以完全删除参数和箭头,只需使用:
->
答案 3 :(得分:0)
下面的所有定义都创建相同的数组。 Kotlin(和IntelliJ)不鼓励使用冗余代码,因此_
比i
“更好”(因为未使用i),“ {nothing”比_
更好。最后,IntelliJ鼓励最后一个参数lambda位于单独的块中-如第四个示例所示:
Array(9, { i -> ' ' })
Array(9, { _ -> ' ' })
Array(9, { ' ' })
Array(9) { ' ' }