申请和申请的区别是什么?据我所知,下面的代码也是这样做的:
应用
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
}有什么不同吗?我应该用一个而另一个吗?另外,在某些情况下,其中一种会起作用,而另一种则不会?
发布于 2017-09-09 15:31:24
TL;DR差异
also函数接受一个lambda,其中引用了您在(receiver T)上调用的带有it (隐式名称)或自定义名称的对象。
val person = Person().also {
it.name = "Tony Stark"
}另一方面,在apply中,使用带有接收方的函数文本,因此在传入的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 (接收方)值。
什么时候使用什么
使用示例将在本thread中解释。
发布于 2018-01-20 12:00:53
简短回答: 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
// ...
}因此,取决于代码的可读性程度,您始终可以使用其中一个或另一个。
发布于 2020-04-16 09:57:59

你决定用哪一种。然而,在Kotlinlang的网站https://kotlinlang.org/docs/reference/scope-functions.html中,有一种使用它们的惯例
对于不更改对象的其他操作,如日志记录或打印调试信息,也可以使用。
val numbers = mutableListOf("one", "two", "three")
numbers
.also { println("The list elements before adding new one: $it") }
.add("four")apply的常见情况是对象配置。
val adam = Person("Adam").apply {
age = 32
city = "London"
}
println(adam)https://stackoverflow.com/questions/46131289
复制相似问题