【问题标题】:Store lambda in a variable in kotlin将 lambda 存储在 kotlin 中的变量中
【发布时间】:2017-05-05 18:27:36
【问题描述】:

我开始使用 kotlin 在 Android 中进行开发,但我遇到了 lambdas 的问题。我有一个在我的视图中设置监听器的函数,它看起来像这样:

fun setListener(listener: () -> Unit) {
}

The problem is that the code passed as lambda won't be executed in setListener function, it will be executed in another part of my code (specifically when an item of a spinner is selected) so I have to "save" or将此lambda“存储”到变量/属性中,以便我能够在需要时执行它。知道怎么做吗?

编辑:我做到了:

private var listener: (() -> Unit)? = null

fun setListener(listener: () -> Unit) {
    this.listener = listener
}

有没有更好的方法呢?谢谢

【问题讨论】:

    标签: android lambda kotlin


    【解决方案1】:

    你可以这样做:

    class Foo {
        private var listener: () -> Unit = {}
        fun setListener(listener: () -> Unit) {
            this.listener = listener
        }
    }
    

    但是,在 Kotlin 中不鼓励手动编写 setter。相反,您可以将您的财产公开:

    class Foo {
        var listener: () -> Unit = {}
    }
    

    作为参考,这里是docs about properties 有很多例子。

    【讨论】:

    • “Getter 可见性必须与属性可见性相同”(即,您不能同时拥有 public setprivate get)。我建议var listener: () -> Unit = {}
    【解决方案2】:

    您可以轻松地将函数存储在属性中。最简单的方法:

    var listener: (() -> Unit)? = null
    

    用法:

    foo.listener = { println("called") }
    

    如果您希望您的属性仅设置,您可以创建一个带有不可用 getter 的公共属性和一个供内部使用的私有属性。完整示例:

    class Example {
    
        // for internal use
        private var _listener: (() -> Unit)? = null
    
        // public set-only
        var listener: (() -> Unit)?
            @Deprecated(message = "set-only", level = DeprecationLevel.ERROR)
            get() = throw AssertionError() // unusable getter
            set(value) { _listener = value } // write-through setter
    
        fun somethingHappend() {
            _listener?.invoke()
        }
    }
    

    【讨论】:

    • 使用此代码时,我在课堂上尝试使用 _listener 时也会出错
    • @aloj 我已经证实并澄清了我的答案。如果您仍然收到错误,请发布错误消息。
    • 您可以使用 private get() = ... 将 getter 设为私有。那么你甚至不需要_listener 属性。
    • @diesieben07 你不能将 setter vilibility 设置为低于 getter 的可见性。
    【解决方案3】:

    这是一个简单的例子。

    fun main(){
        val result=::sum //function assign to variable (first method)
        val result1: (first: Int, second: Int) -> Int=::sum //function assign to variable (second method)
        print(result(5,6))
    
    }
    fun  sum(first:Int,second:Int):Int{
        return first+second;
    }
    

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-22
      • 2013-04-18
      • 2017-04-04
      • 2013-01-31
      相关资源
      最近更新 更多