gpt4 book ai didi

kotlin - Lambda作为函数参数->仅接受来自特定类的方法

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

我希望找到强制emit(S.() -> S)函数接受作为参数的解决方案,仅接受通用S类中的方法。当前解决方案接受所有返回S的lambda方法。
S是一个通用类,它具有减少/修改自己的参数的方法。我只希望在emit中调用这些方法。它保证传递给send的每个方法都是“纯函数”(S中的所有方法都是纯函数)

val _uiState = MutableLiveData<S>() 
var state: S
fun emit(reduction: S.() -> S) {
state = reduction.invoke(state)
if (_uiState.value != state) {
_uiState.postValue(state)
}
}

最佳答案

为此,函数根本不是合适的类型。我将声明一个类型,其值对应于S的方法,因此

class S { 
fun method1(x: String): S = ...
fun method2(): S = ...
...

sealed class Transform {
operator fun invoke(s: S): S = when(this) {
is Method1 -> s.method1(x)
is Method2 -> s.method2()
...
}

class Method1(val x: String) : Transform
object Method2 : Transform
}
}

fun emit(reduction: S.Transform) {
state = reduction.invoke(state)
if (_uiState.value != state) {
_uiState.postValue(state)
}
}

尽力而为,可以自动生成 Transform(例如,使用注释处理器,正如您在评论中提到的那样),但这可能不值得,这取决于您需要处理多少个类和方法以及它们更改的频率。

关于kotlin - Lambda作为函数参数->仅接受来自特定类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56324629/

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