在Kotlin中使用列表或数组的范围

在Kotlin中使用列表或数组的范围,kotlin,range,Kotlin,Range,我试过了,但失败了。“范围”用于哪些情况 变量列表=列表(1,2,3,4,5) 这很有效。但是下面的代码并没有按照我想要的那样工作。为什么? var list=listOf(1..5) 可运行的程序是:。该语法创建了一个包含单个范围的范围列表(list)。您可以使用toList()将范围(或任何Iterable)转换为列表: 您还可以在不必将其转换为列表的情况下对其进行迭代 var list2 = 1..5 list2.forEach { println(it) } 另一个选项(与@

我试过了,但失败了。“范围”用于哪些情况

变量列表=列表(1,2,3,4,5)

这很有效。但是下面的代码并没有按照我想要的那样工作。为什么?

var list=listOf(1..5)


可运行的程序是:。

该语法创建了一个包含单个范围的范围列表(
list
)。您可以使用
toList()
将范围(或任何Iterable)转换为列表:


您还可以在不必将其转换为列表的情况下对其进行迭代

var list2 = 1..5
list2.forEach {
    println(it) 
}
另一个选项(与@Tenfour04 response相同,但更具可读性)是使用
rangeTo
运算符,并将其转换为具有相同扩展功能的列表
toList

(1..5).toList()
val list = 1.rangeTo(5).toList()

我不认为它更可读,但是如果你打算使用<代码> Rangeto ,你就不需要额外的括号了。代码>1.rangeTo(5.toList()当然,您是对的您可以在listOf中使用内部消息,但您将得到一个内部消息列表。您还可以执行列表((1..4)、(1..6)、(1..22)).1。因为
1..5
是返回内部消息的函数调用
listOf()
列出您给它的任何参数,在本例中是一个内部消息列表。您有一个内部消息列表。for循环正在记录列表中的每个项目,但列表中只有一个范围
IntRange.toString()
以这种格式打印范围的表示,如
“$first..$last”
。您可以在源代码中看到它:ArrayList是您可以使用反射与
::class
一起检查的基础类型,但它不是编译器已知的类型,因为在您在函数中接收它之前,它已被强制转换到超类型
列表
。安全约定是使用它被强制转换到的类型。反射会给您带来麻烦,因为您绕过了所调用函数的作者的意图。Kotlin的设计者理论上可以将基础类型更改为其他不是ArrayList的列表实现,然后如果您的代码强制转换它,它将在将来崩溃。例如,通常当函数返回列表时,这意味着您不应该修改其内容,即使您可以检查反射,并看到它实际上是一个可变列表。