gpt4 book ai didi

android - 尽管我有一个 var (kotlin),但无法重新分配 Val?

转载 作者:行者123 更新时间:2023-12-02 13:16:42 25 4
gpt4 key购买 nike

我为数据类创建了一个 var 扩展属性,如下所示:

var Element.bitmap: Bitmap?
get() = downloadImg(PLACE_HOLDER_URL) //Default
set(value) = this.bitmap.let {
it = value ?: return@let
}
但是,当我尝试将“它”重新分配给此行中的新值时,编译器会提示“无法重新分配 Val”:
it = value ?: return@let  
我真的不明白为什么会这样??我有一个“var”位图属性而不是“val”,那么问题是什么?更重要的是什么是解决方案或替代方案?

最佳答案

lambda 中的变量是不可变的,it有变量 bitmap 的浅拷贝.
您应该使用 field分配到支持字段(实际变量)。

set(value) {
value?.let { field = it }
}
let函数创建变量的浅拷贝,因此如果可见可变变量(var)被另一个线程更改,则可以安全地使用它而不会冒突变的风险。
例子:
class Test {
var prop: Int? = 5
}

fun main() {
val test = Test()
thread {
Thread.sleep(100)
test.prop = null
}
if (test.prop != null) {
Thread.sleep(300) // pretend we did something
println(test.prop) // prints null even inside if check
}
}
为了解决这些情况,可以使用浅拷贝,例如 let它传递了这些的不可变浅拷贝。
class Test {
var prop: Int? = 5
}

fun main() {
val test = Test()
thread {
Thread.sleep(100)
test.prop = null
}
test.prop?.let { // `it` is a shallow copy, changes won't be reflected
Thread.sleep(300) // pretend we did something
println(it) // prints 5
}
}
结论:it不是实际变量本身,因此即使您能够将某些内容分配给 it,更改也不会反射(reflect)到实际变量中。 .
编辑:扩展属性不能有支持字段,扩展实际上是 getter 和 setter。
  • 您可以做的一件事是制作一个带有唯一标识符的 Map,您可以在其中存储值,但这可能无法被垃圾收集
  • 您可以做的另一件事(我推荐)是使用委托(delegate)

  • 委托(delegate)示例:
    class ElementBitmapDelegate {
    private var value: Bitmap? = null

    operator fun getValue(thisRef: Any?, property: KProperty<*>): Bitmap {
    return value ?: downloadImg(PLACE_HOLDER_URL).also { setValue(thisRef, property, it) }
    // return value or if value is null return from downloadImg() and set it to value
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, v: Bitmap?) {
    v?.let { value = it } // if v is not null then set value to v
    }
    }


    var Element.bitmap: Bitmap? by ElementBitmapDelegate()

    关于android - 尽管我有一个 var (kotlin),但无法重新分配 Val?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62898769/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com