【问题标题】:Reference to Kotlin class property setter as function将 Kotlin 类属性设置器作为函数引用
【发布时间】:2017-03-18 12:04:52
【问题描述】:

在下面的示例中,t::x 返回对属性 getter 的引用。我如何为二传手获得相同的信息?

class Test(var x: String) {}

fun main(args: Array<String>) {
    val t = Test("A")

    val getter: () -> String = t::x
    println(getter()) // prints A

    val setter: (String) -> Unit = ????
}

【问题讨论】:

    标签: kotlin kotlin-reflect


    【解决方案1】:

    使用t::x.setter,返回一个MutableProperty0.Setter&lt;T&gt;,可以作为函数使用:

    val setter = t::x.setter
    setter("abc")
    

    【讨论】:

    • 有趣的是,这需要一个额外的依赖——kotlin-reflect
    • val getter: () -&gt; String = t::x生成的代码是否与val getter: () -&gt; String = t::x.getter不同
    • 不同的是,后者在KMutableProperty0 接口上有一个额外的方法调用(正如您所料,这就是代码所说的)。您可以在 IntelliJ 中使用 Show Kotlin bytecode 自行检查(这是 Tools -&gt; Kotlin 菜单)。
    • 对 ref 到 getter 和 ref 到 setter 之间的不对称感到羞耻
    • 为了记录,请参阅此处的建议用法kotlinlang.org/docs/reference/…,这是对称的。
    【解决方案2】:

    t::x 的返回类型是KMutableProperty0&lt;String&gt;,它有一个setter 属性,所以可以这样做:

    val setter: (String) -> Unit = t::x.setter
    setter("B")
    println(getter()) // prints B now
    

    【讨论】:

      【解决方案3】:
      t::x::set
      

      这在没有kotlin-reflect 的情况下有效,因为它不调用任何外部方法,不像t::x.setter

      不过,使用 lambda 语法会生成最简洁的代码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 2018-09-25
        • 1970-01-01
        • 2019-07-04
        • 2011-07-25
        相关资源
        最近更新 更多