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 // ... }
所以,取决于你的代码应该如何读取,你总是可以使用其中之一。