应用和也有什么区别

“应用”和“也”的区别是什么? 据我所知,下面的代码做同样的事情:

申请

val person = Person().apply {
name = "Tony Stark"
age = 52
// More such stuff
}

还有

val person = Person().also {
it.name = "Tony Stark"
it.age = 52
// More such stuff
}

有什么区别吗? 我应该用一个而不是另一个吗?还有,有没有这样的情况,一个可以工作,另一个不行?

19688 次浏览

DR 差

also函数接受一个 lambda,在这个 lambda 中,您使用 it(隐式名称)或自定义名称引用您调用函数的对象(接收器 T)。

val person = Person().also {
it.name = "Tony Stark"
}

另一方面,使用了匿名函数 用接收器,这样在 lambda 中传递的内部就可以直接访问接收方的成员,如下所示。接收方可以由 this引用。

val person = Person().apply {
name = "Tony Stark"
}

还有

声明:

inline fun <T> T.also(block: (T) -> Unit): T (source)

调用指定的函数块 this(接收方)值作为参数并返回 this(接收方)值。

申请

声明:

inline fun <T> T.apply(block: T.() -> Unit): T (source)

调用指定的函数块 this值作为接收器并返回 this(接收方)值。

什么时候用什么

线中解释了一些用法示例。

简短的回答: 由于语义方面的原因,引入了 also

长话短说:

如果使用 apply,则始终使用 this引用接收方。

val person = Person().apply {
name = "Tony Stark" // this. can be omitted
age = 52 // this. can be omitted
// ...
}

这样你就不必像下面这样重复说几遍:

person.name = "Tony Stark"
person.age = 52

如果块变长了,你可以给 this一个名字。这就是引入 also的原因。现在,您可以通过 it或显式名称来引用接收方。如果您希望使用比以前(在本例中为 person)更多的名称,这尤其有用:

val person = Person().also { newPerson ->
newPerson.name = "Tony Stark"
newPerson.age = 52
// ...
}

因此,根据您的代码可读性的好坏,您总是可以使用其中之一。

  • 这两个函数都返回接收方对象本身。
  • 它们在访问接收方对象方面有所不同。

enter image description here

你可自行决定使用哪一款,不过,在 Kotlinlang 的网站 abc0上,有一个使用这款产品的惯例

对于不更改对象的其他操作,如日志记录或打印调试信息,请使用 还有

val numbers = mutableListOf("one", "two", "three")
numbers
.also { println("The list elements before adding new one: $it") }
.add("four")

申请的常见情况是对象配置。

val adam = Person("Adam").apply {
age = 32
city = "London"
}
println(adam)