#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 если бы, если бы вы могли изложить суть или задать другой вопрос с более сложным примером о том, чего вы пытаетесь достичь, я или другие могли бы предложить альтернативы.