申请和之间有什么区别.据我所知,下面的代码做了同样的事情:
应用
val person = Person().apply {
name = "Tony Stark"
age = 52
// More such stuff
}
Run Code Online (Sandbox Code Playgroud)
也
val person = Person().also {
it.name = "Tony Stark"
it.age = 52
// More such stuff
}
Run Code Online (Sandbox Code Playgroud)
有什么区别,我应该使用一个吗?此外,是否有一些情况下,一个人会工作,另一个不会?
s1m*_*nw1 24
定义:
val person = Person().also {
it.name = "Tony Stark"
}
Run Code Online (Sandbox Code Playgroud)
使用此值作为参数调用指定的功能块并返回此值.
定义:
val person = Person().apply {
name = "Tony Stark"
}
Run Code Online (Sandbox Code Playgroud)
使用此值作为其接收器调用指定的功能块并返回此值.
该also函数接收一个lambda,T在实现中传递给它,因此在lambda中你用一个名称引用它(it默认情况下).
在{ otherName -> ...}另一方面,文字的功能与接收器使用,所以通过拉姆达内不必增加额外的前缀来访问它的成员,你在你的例子中看到.接收器可以参考apply.
用法示例在此主题中进行了说明.
Wil*_*zel 17
简答: also是出于语义原因而引入的.
答案很长:
如果您使用,apply请始终参考接收器this.
val person = Person().apply {
name = "Tony Stark" // this. can be omitted
age = 52 // this. can be omitted
// ...
}
Run Code Online (Sandbox Code Playgroud)
这样你就不必重复几次了,如下所示:
person.name = "Tony Stark"
person.age = 52
Run Code Online (Sandbox Code Playgroud)
如果块变长,您可能想要给出this一个名称.这就是为什么also被引入的原因.现在您可以通过it或明确的名称来引用接收器.如果您想在之前使用其他名称(在本例中person),则此功能特别有用:
val person = Person().also { newPerson ->
newPerson.name = "Tony Stark"
newPerson.age = 52
// ...
}
Run Code Online (Sandbox Code Playgroud)
因此,根据您的代码的可读性,您可以始终使用其中一个.
oiy*_*yio 10
使用哪一个由您决定。但是,在 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")
Run Code Online (Sandbox Code Playgroud)
apply的常见情况是对象配置。
val adam = Person("Adam").apply {
age = 32
city = "London"
}
println(adam)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5572 次 |
| 最近记录: |