Доступ к внешней ценности внутри

Краткий пример:

class MyClass { val someName = "want this value" val someOther = SomeOther().apply{ someName = someName } // other stuff below } 

SomeOther применит значение своего собственного someName к someName , поэтому приложение value не делает различий (x = x).

В: Как я могу получить доступ к внешнему имени someName ( «хочу, чтобы это значение» ) внутри?

ОБНОВЛЕНИЕ У меня есть дополнительные сомнения, связанные с предложением использовать this.someName=someName , ниже 2 фрагментов кода, первый работает так, как ожидалось, неожиданно второе не работает с аналогичным поведением, как описано.

Первый

 fun main(args: Array<String>) { class SomeOther { var someName: String? = null } val someName = "want this value" print(SomeOther().apply { this.someName = someName }.someName) // works! } 

второй

 class SomeOther { var someName: String? = null } class MyClass { val someName = "want this value" val someOther = SomeOther().apply { this.someName = someName } fun go() = print(someOther.someName) } fun main(args: Array<String>) = MyClass().go() // prints null 

В: Где разница?

Вместо этого вы можете использовать функцию -функцию. Это эквивалентно apply , за исключением того, it вместо this он свяжет ваш объект с it :

 val someName = "want this value" val someOther = SomeOther().also { it.someName = someName } 

Кроме also функция была добавлена ​​в Kotlin 1.1 специально для тех случаев, когда вы не хотите затушевывать this из внешней области.

используя это ссылочное выражение, как показано ниже:

 val someOther = SomeOther().apply { someName = this@MyClass.someName } // reference to the outer class ---^ 

И функция T.apply является удобным способом применения шаблона проектирования Builder , таким образом вам никогда не нужно использовать this или дополнительный параметр вообще, например:

 val foo = Foo().apply { //v--- no need using `this` or any addition parameters foo = "bar" fuzz = "buzz" } class Foo { lateinit var foo: String; lateinit var fuzz: String } 

редактировать

вы можете принять apply(lambda) которая будет применять анонимный класс экземпляра Function2<T,ARG,T> , тогда вы знаете, почему сразу?

в вашем первом подходе это выглядит так:

 val lambda: Function2<SomeOther, String, SomeOther> = { thisRef, arg -> thisRef.someName = arg; // ^--- parameter is used in lambda thisRef } val someName = lambda(SomeOther(), "want this value").someName println(someName) 

в вашем втором подходе это выглядит так:

 class MyClass { val lambda: Function2<SomeOther, MyClass, SomeOther> = { thisRef, arg -> // the parameter `arg` is never used in lambda ---^ thisRef.someName = thisRef.someName // ^--- it use thisRef's someName rather than arg's thisRef } val someOther = lambda(SomeOther(), this) } 

Попробуй это:

 val someName = "want this value" val otherName = SomeOther().apply { this.someName = someName } // internal someName ---^ ^ // external someName ---^ print(otherName.someName) // >>> want this name 
Intereting Posts
JUnit, @ControllerAdvice и отсутствие проверенных исключений в Kotlin Как я могу переопределить java-метод и изменить значение nullability параметра? Как отключить клавиатуру, когда я нажимаю EditText? Spring Security несколько успешных поставщиков аутентификации Kotlin Coroutines с таймаутом Recyclerview: прослушивание событий с добавлением кликов Каков самый умный способ скопировать карту в Котлин? Процессор аннотации Kotlin дает ошибку времени компиляции при использовании Room with Android Studio 3.0 beta7 «Недостаточно информации для вывода параметра T» с помощью Kotlin и Android Преобразовать предикат kotlin в java Непроверенный при бросании объекта типа Any? в лямбда в котлин Отражение Котлина – получение всех названий полей класса IntelliJ не сортирует импорт Котлин Kotlin Kapt failing – видит только источники уровня авиалинии aproid BeanDefinitionParsingException при попытке использовать JPA с загрузкой Kotlin и Spring