当前位置: 首页 > 知识库问答 >
问题:

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

谢财
2023-03-14

我有这两个函数,我试图修改元素。其中一个编译,另一个说“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个答案

董飞
2023-03-14

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

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

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

如果你写

val i = obj

如果对象是可变对象,它仍然可以变异<由于无法更改引用,因此无法重新分配代码>i。

袁元明
2023-03-14

尝试以下操作:

for(i:Int in 0 until this.size) {
    this[i] = "your value"
}
姚实
2023-03-14

类似于函数参数在Kotlin中的最终形式,循环中使用的变量也是如此。本质上,写下。。。

for (i in array) {
    ...
}

。。。相当于在Java中执行此操作:

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

这有助于捕获一些常见错误,在这种情况下,如果编译器允许的话,您可以重新分配这个仅包含对实元素引用的局部变量,而不更改数组。用Java术语来说,您可以这样做:

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

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

 类似资料:
  • 我为数据类创建了一个var扩展属性,如下所示: 但是,当我尝试将“Val”重新分配给此行中的新值时,编译器会抱怨“Val无法重新分配”: 我真的不明白为什么会这样??我有一个“var”位图属性而不是“val”,那么问题是什么?更重要的是,什么是解决方案或替代方案?

  • 我试图在kotlin中编写一个函数,但我无法将值重新分配给函数参数,它说val不能重新分配。 当我试图分配一个值url=主页. it给我错误val不能重新分配,我是新的kotlin,我不明白是什么问题,很少帮助将不胜感激。

  • 我在IntelliJ中使用静态编程语言。 我有一段简短的代码 为什么在这个世界上它告诉我: 关于提到的变量,“Val不能重新分配”任何val实例都已完全更改为var。 为了确保这一点,我已经在其他类中更改了同名的变量,甚至还将类中的每个变量都更改为var,我仍然会遇到这个错误。 这与可拉伸的性质有关吗? 我错过了什么或做错了什么来得到这个错误,我如何修复它? 非常感谢。

  • 由分配的内存可以用重新分配。有类似的函数吗?当您不希望在堆上分配内存,并且需要多次分配可变堆栈内存(例如在库函数中,您需要动态内存,但不希望在堆上分配)时,重新分配堆栈内存可能很有用,因为库的用户可能使用自定义的堆分配策略。它看起来是这样的: 重要的是,这一切都发生在堆栈上。问:有重新分配动态堆栈内存的方法吗?

  • 根据下面的php代码,输出为 我理解&$ref是通过引用传递的。但在赋值之后类似($row=&$ref;)在任何地方,每当“row”更改值时,“ref”也会更改为与“row”相同的值。真的很迷惑。似乎=不仅将右值赋给左值。有人能核实一下吗?