Kotlin – 在循环解构不工作 – var不可访问

一些背景 :

val (name, age) = person 

这个语法被称为解构声明。 它在同一时间创建多个variables( 更正,创建多个值 )。

解构声明也适用于for循环:当你说:

 for ((a, b) in collection) { ... } 

让我们看看我有一个列表项:

  @Parcelize data class MyModel( var name: String = "", var is_locked: Boolean = true, var is_one_size: Boolean = false, ) : Parcelable 

现在我已经获得了“MyModel”类的列表,我试图循环他们像这样:

 private fun initMyModelList(model: MutableList) { //i want to access is_locked from here with destruction but i cant ? IDE telling me the type is an int but its clearly defined as a Boolean for((is_locked) in model){ //what i want to do in here is access the is_locked var of the model list and change all of them in a loop. im trying to use Destructuring in loop as a conveience. why is it not working ? //how can i make the call signature look like this--- > is_locked = true instad of model.is_locked =true } } 

我想要做的就是能够在循环中调用is_locked = true而不是model.is_locked = true。 如何才能做到这一点 ?

这个语法被称为解构声明。 它在同一时间创建多个variables。

它不会创建多个variables,它会捕获多个值。 你正在处理值,而不是引用,因为你的源进一步告诉:

解构声明被编译成以下代码:

 val name = person.component1() val age = person.component2() 

最接近你想要的是这个自定义扩展function:

 inline fun  Iterable.withEach(block: E.() -> Unit) { forEach { it.block() } } 

像这样使用:

 model.withEach { is_locked = true } 

在你提出强制性问题之前,为什么不包含在stdlib中呢? 认为函数式编程通常是关于转换不可变types的。 基本上,我在这里做的是鼓励坏习惯。

基本上,这是不可能的,导致你的代码被编译为像这样的东西:

 for (m in models) { val is_locked = m.component1() ... } 

这意味着你创建了一个不能被重新分配的本地属性。 但是你可以做这样的事情:

 for (m in model) { with(m) { is_locked = true } } 

是的,这不是完美的,但可以用扩展方法来改进:

 fun  List.forEachApply(block: T.() -> Unit) { forEach(block) } private fun initMyModelList(model: MutableList) { model.forEachApply { is_locked = true } } 

你可以在循环中使用解构,就像只读值一样。

 data class Stuff(val name: String, val other: String) fun doStuff() { val stuff = Stuff("happy", "day") val stuffs = listOf(stuff) for ((name) in stuffs) { println(name) } } 

运行该方法会在控制台上输出“happy”。 Baeldung展示了一个在这里使用它的例子。

数据类是最好的实践是不可变的,所以我会尝试重写你的数据类是不可变的。 .copy函数将允许您复制您的数据类,但具有新的,不同的值。