Как получить экземпляр класса внутри лямбда-выражения в Kotlin?

#java #kotlin #lambda #inner-classes

#java #kotlin #лямбда #внутренние классы

Вопрос:

В java, когда я хочу получить экземпляр внешнего класса из внутреннего класса, я пишу OutClass.this . В Kotlin внутри лямбда-выражения есть ли способ получить экземпляр класса, в котором записано лямбда-выражение, если лямбда-выражение выполняется с получателем? Допустим, у нас есть следующий код:

 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
         }
  }
}
 

Комментарии:

1. Вы могли бы рассмотреть возможность использования also вместо apply , чтобы избежать двусмысленности в подобных случаях.

Ответ №1:

Вы ищете this@OuterClass.funcA() .

Комментарии:

1. Да, я 🙂 Спасибо

Ответ №2:

У меня аллергия на метки, поэтому я предпочитаю присваивать явно именованным переменным:

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

Еще лучше полностью избегать разных this контекстов (очевидно, ваш пример надуманный, так же как и этот):

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

Комментарии:

1. в вашем последнем коде у вас нет лямбда-выражения, поэтому я не понимаю, как я могу избежать этого , а также не использовать метки

2. Я бы попытался провести рефакторинг, чтобы избежать необходимости в метке, если это возможно. Вы правильно предоставили минимальный пример, поэтому единственный способ продемонстрировать это на примере — полностью удалить лямбда.

3. @DorVak если бы, если бы вы могли изложить суть или задать другой вопрос с более сложным примером о том, чего вы пытаетесь достичь, я или другие могли бы предложить альтернативы.