Kotlin:Apply和Also之间有什么区别

Kan*_*mal 29 kotlin

申请和之间有什么区别.据我所知,下面的代码做了同样的事情:

应用

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 次

最近记录:

6 年,10 月 前