代码之家  ›  专栏  ›  技术社区  ›  hsz

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

  •  0
  • hsz  · 技术社区  · 6 年前

    我创建了一个类,它接受一个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
        }
    )
    

    是否可以从 点击 功能?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Willi Mentzel user670265    6 年前

    当然,你可以给 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
    

    我会和最后一个一起去。