Kotlin предоставляет несколько так называемых функций области видимости.Некоторые из них используют литерал функции с получателем , что позволяет писать код, подобный тому, который вы предоставили в Visual Basic.Оба, with
и apply
подходят для этого случая.Интересно отметить, что with
возвращает произвольный результат R
, тогда как apply
всегда возвращает конкретный приемник, для которого была вызвана функция.
Для вашего примера рассмотрим обе функции:
with
Используя with
, мы можем написать код следующим образом:
val customer = Customer()
with(customer) {
name = "Coho Vineyard"
url = "http://www.cohovineyard.com/"
city = "Redmond"
}
Последнее выражение лямбды, переданное with
, является здесь присваиванием, которое в Kotlin возвращает Unit
.Вы можете присвоить результат вызова with
какой-то новой переменной, которая затем будет иметь тип Unit
.Это бесполезно, и весь подход не очень идиоматичен, так как мы должны отделить объявление от фактической инициализации customer
.
apply
Сapply
с другой стороны, мы можем объединить объявление и инициализацию, так как она возвращает своего получателя по умолчанию:
val customer = Customer().apply {
name = "Coho Vineyard"
url = "http://www.cohovineyard.com/"
city = "Redmond"
}
Как вы можете видеть, всякий раз, когда вы хотите инициализировать некоторый объект,предпочитайте apply
(функция расширения определена для всех типов). Здесь еще одна ветка о различиях между с и apply.