Visual Basic с эквивалентом в Kotlin - PullRequest
0 голосов
/ 03 января 2019

В Visual Basic мы можем использовать с выражением, подобным этому:

 With theCustomer
        .Name = "Coho Vineyard"
        .URL = "http://www.cohovineyard.com/"
        .City = "Redmond"
 End With

Я ищу что-то подобное.Возможно ли это в Котлине?

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Как то так?

    with(theCustomer) {
        Name = "Coho Vineyard"
        URL = "http://www.cohovineyard.com/"
        City = "Redmond"
    }

Но with требует ненулевой параметр. Я предлагаю использовать let или apply вместо.

    theCustomer?.apply{
        Name = "Coho Vineyard"
        URL = "http://www.cohovineyard.com/"
        City = "Redmond"
    }

или

    theCustomer?.let{ customer ->
        customer.Name = "Coho Vineyard"
        customer.URL = "http://www.cohovineyard.com/"
        customer.City = "Redmond"
    }
0 голосов
/ 03 января 2019

Kotlin предоставляет несколько так называемых функций области видимости.Некоторые из них используют литерал функции с получателем , что позволяет писать код, подобный тому, который вы предоставили в Visual Basic.Оба, with и apply подходят для этого случая.Интересно отметить, что with возвращает произвольный результат R, тогда как apply всегда возвращает конкретный приемник, для которого была вызвана функция.

Для вашего примера рассмотрим обе функции:

  1. with

    Используя with, мы можем написать код следующим образом:

    val customer = Customer()
    with(customer) {
        name = "Coho Vineyard"
        url = "http://www.cohovineyard.com/"
        city = "Redmond"
    } 
    

    Последнее выражение лямбды, переданное with, является здесь присваиванием, которое в Kotlin возвращает Unit.Вы можете присвоить результат вызова with какой-то новой переменной, которая затем будет иметь тип Unit.Это бесполезно, и весь подход не очень идиоматичен, так как мы должны отделить объявление от фактической инициализации customer.

  2. apply

    Сapply с другой стороны, мы можем объединить объявление и инициализацию, так как она возвращает своего получателя по умолчанию:

    val customer = Customer().apply {
        name = "Coho Vineyard"
        url = "http://www.cohovineyard.com/"
        city = "Redmond"
    }
    

Как вы можете видеть, всякий раз, когда вы хотите инициализировать некоторый объект,предпочитайте apply (функция расширения определена для всех типов). Здесь еще одна ветка о различиях между с и apply.

0 голосов
/ 03 января 2019

Вы можете использовать функцию with из библиотеки Kotlin Standard, например ::

with(theCustomer) {
    name = "Coho Vineyard"
    url = "http://www.cohovineyard.com/"
    city = "Redmond"
}

with() возвращает некоторый результат. Это делает код чище.

Также вы можете использовать apply функцию расширения:

theCustomer.apply { 
    name = "Coho Vineyard"
    url = "http://www.cohovineyard.com/"
    city = "Redmond"
}

apply - объявлено в классе Any, может вызываться для экземпляров всех типов, делает код более читабельным. Используйте, когда нужно использовать экземпляр объекта (изменить свойства), выразить цепочку вызовов. Он отличается от with() тем, что возвращает Receiver.

...