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
函数将允许您复制您的数据类,但具有新的,不同的值。