Delegates.observable可用于Kotlin中的匿名函数?

时间:2019-06-12 13:34:35

标签: kotlin

我做的事情很奇怪,但我有短暂的感觉,应该有可能。

使用Kotlin可以进行以下操作吗? (它可以编译但不起作用)

 var delegatedProp: (Int) -> Unit by Delegates.observable({ a-> Unit }) { _, _, newVal ->
        //This is never raised
        //Secondly how should I access the given Int ?
        //newVal.a doesn't seem to compile
    }

我的主意是,一旦我调用了proxyedProp(10),可观察对象就会被调用,并且我将能够访问newVal.a。

这将成功编译,但不会调用可观察对象

1 个答案:

答案 0 :(得分:2)

当您设置delegatedProp (即

)时,第二个lambda将被调用
x.delegatedProp = { print(it) }

({{ print(it) }只是类型(Int) -> Unit的示例)。 newVal将是您将属性设置为的函数,在本例中为{ print(it) }。因此它没有.a

如果您想在调用delegatedProp(10)时做点什么,只需...将这些操作放入函数中即可。

val delegatedProp: (Int) -> Unit = { a -> /* do whatever you wanted to do with newVal.a */ }

如果您希望delegatedProp成为var,但又想继续执行分配给您的“额外”操作,则最简单的方法可能是自定义获取方法:

var delegatedProp: (Int) -> Unit = { a -> Unit }
    get() = { a ->
        /* whatever you want to do with a */
        field(a)
    }

或setter:它不会在每次访问时都创建一个新的lambda,但是要么重复一些代码,要么至少需要显式设置一次,并且不仅要初始化。