代码之家  ›  专栏  ›  技术社区  ›  Dishonered

无法重新分配Kotlin-Val,但可以通过从索引访问重新分配?

  •  1
  • Dishonered  · 技术社区  · 6 年前

    在我尝试修改元素的地方,有这两个函数。其中一个编译,另一个说“val不能重新分配”。以下功能有什么区别?为什么一个编译而另一个不编译?

    编译的那个

    fun <T> Array<T>.mapInPlace2(transform: (T) -> T) {
    for (i in this.indices) {
        this[i] = transform(this[i])
    }
    }
    

    那个说

    无法重新分配VAL

    fun <T> Array<T>.mapInPlace1(transform: (T) -> T) {
    for (i in this) {
        i = transform(i);
    }
    }
    
    3 回复  |  直到 6 年前
        1
  •  6
  •   zsmb13    6 年前

    类似于如何 function parameters are final in Kotlin ,中使用的变量也是 for 循环。基本上,写下…

    for (i in array) {
        ...
    }
    

    …相当于在Java中这样做:

    for (final int i : array) {
        ...
    }
    

    这有助于捕获一些常见的错误,在这种情况下-如果编译器允许您-您将重新分配只包含对实数元素引用的本地变量,而不更改数组。在Java方面,你会这样做:

    for (int i : array) {
        i = transform(i);
    }
    

    这个新的价值 i 如果未使用,则不会更改数组本身,当循环出现时,它将立即被下一个元素的值覆盖。

        2
  •  1
  •   Carcigenicate    6 年前

    您混淆了对象和对象本身引用的可变性。

    在第一个示例中,结构是可变的,但对它的引用是不可变的。可以更改对象本身的结构,但不能更改引用指向的结构。

    在第二个示例中,您试图更改对对象的不可变引用,而不是对象本身。

    如果你写信

    val i = obj
    

    obj 如果它是一个可变的对象,它仍然可以变异。 i 但是不能重新分配,sine引用不能更改。

        3
  •  1
  •   A-Sharabiani    6 年前

    试试这个:

    for(i:Int in 0 until this.size) {
        this[i] = "your value"
    }
    
    推荐文章