gpt4 book ai didi

kotlin - 有没有办法在 kotlin 中编写可暂停的委托(delegate)属性?

转载 作者:行者123 更新时间:2023-12-02 13:35:32 26 4
gpt4 key购买 nike

我试图实现类似于 Process Variables 的东西使用 kotlin 提供的名为 delegate 的特殊功能。

让我们来看以下简单用例:

  • 我有两个变量,分别是 var voltage: Floatvar light: Boolean
  • 电压大于5.0时,我想开灯
  • 电压小于5.0时,我想关灯

注意每次变量变化需要发布变化值(涉及网络调用)

以上用例在以下代码片段中捕获

    suspend fun publishLightStatus(status: Boolean): Unit = TODO()
suspend fun publishVoltage(voltage: Float): Unit = TODO()

fun subscribeToVoltage(block: (Float) -> Unit): Unit = TODO()

var light: Boolean by Delegates.observable(false) { _, _, n ->
publishLightStatus(n)
}

var voltage: Float by Delegates.observable(0F) { _, _, n ->
if(n > 5.0) light = true
else if (n < 5.0) light = false

publishVoltage(n)
}

// usage
subscribeToVoltage {
voltage = it
}

以上代码无法编译,因为当前 property delegates 不支持暂停。ReadWriteProperty 中的 getValuesetValue 函数不可暂停。也不支持 suspend operator getValue() 语法。

我有办法解决这个问题吗?我真的不想与使用站点代码妥协。另一件重要的事情是,voltage = it 这应该在 publishVoltage(n) 调用完成时返回。

最佳答案

一般情况下,属性应该很简单并且返回速度应该很快。他们不应该暴露任何东西以保证暂停,但这只是一种意见。

目前无法执行此操作,但存在 YouTrack 问题 herehere关于这个。

您也可以尝试使用 runBlockingGlobalScope.launch,它们可能适合您的需要。

关于kotlin - 有没有办法在 kotlin 中编写可暂停的委托(delegate)属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58064438/

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