在Kotlin中具有等效功能的Visual Basic

时间:2019-01-03 08:42:32

标签: kotlin basic

在Visual Basic中,我们可以使用With这样的表达式:

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

我正在寻找类似的东西。在科特林有可能吗?

3 个答案:

答案 0 :(得分:3)

您可以使用Kotlin标准库中的with函数,例如:

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。

答案 1 :(得分:3)

Kotlin提供了多个所谓的范围函数。其中一些使用function literal with receiver,使得可以编写与您在Visual Basic中提供的代码类似的代码。 withapply都适合这种情况。有趣的是,with返回了任意结果R,而apply总是返回在其上调用了函数的具体接收者。

在您的示例中,让我们考虑两个功能:

  1. with

    使用with,我们可以编写如下代码:

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

    此处传递给with的lambda的最后一个表达式是一个赋值,该赋值在Kotlin中返回Unit。您可以将with调用的结果分配给某个新变量,该变量的类型为Unit。这是没有用的,并且整个方法不是很惯用,因为我们必须将声明与customer的实际初始化分开。

  2. apply

    另一方面,apply可以将声明和初始化结合起来,因为默认情况下它会返回其接收者:

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

如您所见,每当要初始化某个对象时,都喜欢使用apply(在所有类型上定义的扩展功能)。 Here的另一个主题是with和apply之间的区别。

答案 2 :(得分:0)

像这样吗?

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

但是with需要不可为空的参数。我建议改用letapply

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