Уничтожить с помощью итератораIndex () - PullRequest
0 голосов
/ 26 сентября 2018

Возиться с декларациями о деструктурировании и меня озадачивает следующее:

private data class TestData(var i: String, var j: Int) : Any() {}
private var mlist = mutableListOf<TestData>()

fun main(args: Array<String>) {

    mlist.add(TestData("Hi", 5))
    mlist.add(TestData("There", 53))
    mlist.add(TestData("Test", 2345))
    for ((i, v) in mlist.withIndex()) {

       println(i.toString() + " ok " + v.i + " " + v.component2())//Why does this line compile? 

       println("${i::class.qualifiedName}") // Printed classname is Int
   }
}

Насколько я понимаю, код разрушает

fun <T> Array<out T>.withIndex(): Iterable<IndexedValue<T>> (source)

Но почему v.i скомпилировать?Что происходит?

Код выводит:

0 ok Привет 5
kotlin.Int
1 ok Там 53
kotlin.Int
2 ок Тест 2345
kotlin.Int

1 Ответ

0 голосов
/ 26 сентября 2018

Ваш следующий код

for ((i, v) in mlist.withIndex()) {...

равен

for (item in mlist.withIndex()) {
    val i: Int = item.component1() //it is index in your list
    val v: TestData = item.component2()
    ...

Если вы хотите получить только TestData элементов, удалите withIndex call

for (item in mlist) {
    val i: String = item.component1()
    val v: Int = item.component2()
    ...

Чтобы это сработало, ваш класс должен иметь operator fun для упомянутого componentN.Ваш класс TestData имеет его, потому что вы пометили его как data class.

И давайте вернемся к строке кода, которая вас смущает

println(i.toString() + " ok " + v.i + " " + v.component2())

Как мы уже знаем- v: TestData.Итак, i здесь верно, что вы упомянули в основном конструкторе с ключевым словом var.

private data class TestData(var i: String, var j: Int)

Также его можно пометить как val - в вашем случае это не имеет смысла, нотогда вы просто не сможете редактировать это значение свойства ( здесь вы можете прочитать о конструкторах).

private class TestData(i: String, j: Int) //this won't work in your case
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...