首页 > 解决方案 > 在构造函数中传递的 lambda 函数中访问类上下文

问题描述

我创建了一个接受输入参数的类,它是一个 lambda 函数:

class MyClass(var onClick: () -> Unit) {
    private val title = SomeComponent()

    init {
        // register some listeners that finally invokes `onClick`
        // for simplicity, let's assume:

        title.addKeyListener(object : KeyListener {
            override fun keyPressed(e: KeyEvent?) {
                onClick()
            }
        })
    }
}

MyClass是使用提供的初始化onClick

val instance = MyClass(
    onClick = {
        // some logic
    }
)

是否可以从onClick函数内部访问类上下文?

标签: lambdakotlin

解决方案


当然,您可以onClick MyClass作为接收者提供。

class MyClass(var onClick: MyClass.() -> Unit) { //...

    init {
        //...
        onClick()
        //...
    }
}

fun main() {
    MyClass { 
        // "this" is the instance of MyClass here
    }
}

在该init块中,您可以调用三个选项onClick()

this.onClick()
onClick(this)
onClick() // is invoked on this, but this is omitted

我会选择最后一个。


推荐阅读