在Visual Basic中,我们可以使用With这样的表达式:
With theCustomer
.Name = "Coho Vineyard"
.URL = "http://www.cohovineyard.com/"
.City = "Redmond"
End With
我正在寻找类似的东西。在科特林有可能吗?
答案 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中提供的代码类似的代码。 with
和apply
都适合这种情况。有趣的是,with
返回了任意结果R
,而apply
总是返回在其上调用了函数的具体接收者。
在您的示例中,让我们考虑两个功能:
with
使用with
,我们可以编写如下代码:
val customer = Customer()
with(customer) {
name = "Coho Vineyard"
url = "http://www.cohovineyard.com/"
city = "Redmond"
}
此处传递给with
的lambda的最后一个表达式是一个赋值,该赋值在Kotlin中返回Unit
。您可以将with
调用的结果分配给某个新变量,该变量的类型为Unit
。这是没有用的,并且整个方法不是很惯用,因为我们必须将声明与customer
的实际初始化分开。
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
需要不可为空的参数。我建议改用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"
}