代码之家  ›  专栏  ›  技术社区  ›  mohammad

在Kotlin中具有等效项的Visual Basic

  •  1
  • mohammad  · 技术社区  · 7 年前

    在Visual Basic中,我们可以使用 With 表达式如下:

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

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

    3 回复  |  直到 7 年前
        1
  •  3
  •   s1m0nw1    7 年前

    Kotlin提供多个所谓的作用域函数。其中一些人利用 function literal with receiver 使您可以编写类似的代码,如您在VisualBasic中提供的那样。两个, with apply 适合这种情况。注意到这一点很有趣 具有 返回一些任意结果 R 虽然 应用 始终返回调用函数的具体接收器。

    对于您的示例,让我们考虑这两个函数:

    1. 具有

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

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

      传递给的lambda的最后一个表达式 具有 这是一个作业,在Kotlin中,它返回 Unit . 您可以分配 具有 调用某个新变量,该变量的类型为 单位 .这并不有用,而且整个方法也不是很惯用,因为我们必须将声明与 customer .

    2. 应用

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

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

    如您所见,每当您想初始化某个对象时,首选 应用 (在所有类型上定义了扩展函数)。 Here 是关于with和apply之间差异的另一个线索。

        2
  •  3
  •   Sergio    7 年前

    你可以使用 with 来自Kotlin标准库的功能,例如:

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

    应用 -声明 Any 类,它可以在所有类型的实例上调用,从而使代码更具可读性。当需要使用对象的实例(修改属性)时使用,表示调用链。 它不同于 () 它返回接收器。

        3
  •  0
  •   nhp    7 年前

    像这样?

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