gpt4 book ai didi

kotlin - kotlin 扩展属性的惰性初始化器中的这个引用

转载 作者:IT老高 更新时间:2023-10-28 13:39:46 25 4
gpt4 key购买 nike

我正在尝试 Kotlin 并想为 Activity 实现一个惰性扩展属性:

/**
* Activity module
*/
val Activity.activityModule: ActivityModule by lazy {
ActivityModule(this)
}

编译器错误:

'this' is not defined in this context

我如何才能将其限定为 Activity this?我已阅读 a guide但无法得到它。 this@Activity 表示引用未解析。

最佳答案

此处的其他答案指出,在 stdlib 的 lazy 接收器的当前实现中引用 this 是不可能的,并且可以实现自己的委托(delegate)。所以我决定实现它并在这里发布......:

class LazyWithReceiver<This,Return>(val initializer:This.()->Return)
{
private val values = WeakHashMap<This,Return>()

@Suppress("UNCHECKED_CAST")
operator fun getValue(thisRef:Any,property:KProperty<*>):Return = synchronized(values)
{
thisRef as This
return values.getOrPut(thisRef) {thisRef.initializer()}
}
}

Here is some code showing how to use it.

此实现使用弱 HashMap 来为每个接收者存储单独的值...这有几个含义...:

  • structurally equal 的不同实例将共享相同的值。

  • 在某些情况下,已经为某个接收器初始化的值可能会被垃圾回收,这意味着如果再次访问该值,可能会再次调用初始化器以重新初始化该值。

关于kotlin - kotlin 扩展属性的惰性初始化器中的这个引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34391255/

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