在构造函数中传递的lambda函数中的访问类上下文

时间:2019-01-28 07:33:57

标签: lambda kotlin

我创建了一个带有输入参数的类,该输入参数是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函数内部访问类上下文?

1 个答案:

答案 0 :(得分:2)

当然,您可以将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

我会选择最后一个。