Kotlin:Apply和Also有什么区别?

申请和还有什么区别? 从我所知道的下面的代码做同样的事情:

应用

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 } 

有什么区别,我应该使用一个吗? 另外,有些情况下,一个会工作,另一个不会?

定义:

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

以此值为参数调用指定的function块并返回此值。

应用

定义:

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

使用此值作为接收方调用指定的function块并返回此值。

区别

这个函数also接收一个lambdaexpression式,在这个lambdaexpression式中,在lambdaexpression式中引用了一个名字(默认情况下)。

apply另一方面,使用与接收器的函数文字,所以在传递的lambda中,你不必添加额外的前缀来访问它的成员,如你在你的例子中看到的。 接收器可以被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 ),此function特别有用:

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

所以,取决于你的代码应该如何读取,你总是可以使用其中之一。