【问题标题】:How to get a class instance inside a lambda expression in Kotlin?如何在 Kotlin 的 lambda 表达式中获取类实例?
【发布时间】:2020-11-24 17:42:40
【问题描述】:

在 java 中,当我想从内部类中获取外部类实例时,我正在编写 OutClass.this。 在 Kotlin 中,如果 lambda 与接收器一起运行,在 lambda 表达式中是否有一种方法可以获取编写 lambda 表达式的类的实例? 假设我们有以下代码:

class Dog
{
    fun funcA () : Unit
    {
        println("Dog funcA")
    }
}  
class OuterClass
{ 
   var d : Dog = Dog()
   fun funcA () : Unit
   {
        println("OuterClass funcA")
   }
   
  fun funcWithLambda() : Unit
  {
      d.apply(){
         //place where I want to call OutClass method *funcA*
         // writing *this* will refer to *Dog* instance
         }
  }
}

【问题讨论】:

  • 您可以考虑使用also 而不是apply 以避免在这种情况下产生歧义。

标签: java kotlin lambda inner-classes


【解决方案1】:

您正在寻找this@OuterClass.funcA()

【讨论】:

  • 是的,我是 :) 谢谢
【解决方案2】:

我对标签过敏,所以更喜欢分配给明确命名的变量:

val outer: OuterClass = this
d.apply() {
    val inner: Dog = this
    outer.funcA()
    inner.funcA()
}

更好的是完全避免不同的this 上下文(显然你的例子是人为的,所以这个也是):

fun funcWithoutLambda(): Unit {
    funcA()
    d.funcA()
}

【讨论】:

  • 在您的最后一个代码中,您没有 lambda 表达式,所以我不明白如何避免 this 并且不使用标签
  • 如果可能,我会尝试重构以避免需要标签。你正确地提供了一个最小的例子,所以我可以用这个例子证明这一点的唯一方法是完全删除 lambda。
  • @DorVak 如果您可以提供一个要点或通过更复杂的示例提出另一个问题,说明您想要实现的目标,我或其他人可能会提出替代方案。
猜你喜欢
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
相关资源
最近更新 更多