首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >科林:申请和申请有什么区别?

科林:申请和申请有什么区别?
EN

Stack Overflow用户
提问于 2017-09-09 13:36:56
回答 3查看 19.6K关注 0票数 79

申请和申请的区别是什么?据我所知,下面的代码也是这样做的:

应用

代码语言:javascript
复制
val person = Person().apply {
    name = "Tony Stark"
    age = 52
    // More such stuff
}

也是

代码语言:javascript
复制
val person = Person().also {
  it.name = "Tony Stark"
  it.age = 52
  // More such stuff
}

有什么不同吗?我应该用一个而另一个吗?另外,在某些情况下,其中一种会起作用,而另一种则不会?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-09 15:31:24

TL;DR差异

also函数接受一个lambda,其中引用了您在(receiver T)上调用的带有it (隐式名称)或自定义名称的对象。

代码语言:javascript
复制
val person = Person().also {
    it.name = "Tony Stark"
}

另一方面,在apply中,使用带有接收方的函数文本,因此在传入的lambda中,您可以直接访问接收方的成员,如下所示。接收器可由this参考。

代码语言:javascript
复制
val person = Person().apply {
    name = "Tony Stark"
}

也是

声明:

代码语言:javascript
复制
inline fun <T> T.also(block: (T) -> Unit): T (source)

使用this (接收方)值作为参数调用指定的函数块,并返回this (接收方)值。

应用

声明:

代码语言:javascript
复制
inline fun <T> T.apply(block: T.() -> Unit): T (source)

调用指定的函数块,以值作为接收方,并返回this (接收方)值。

什么时候使用什么

使用示例将在本thread中解释。

票数 62
EN

Stack Overflow用户

发布于 2018-01-20 12:00:53

简短回答: also是出于语义原因而引入的。

长答案:

如果使用apply,则总是引用带有this的接收器。

代码语言:javascript
复制
val person = Person().apply {
    name = "Tony Stark" // this. can be omitted
    age = 52 // this. can be omitted
    // ...
}

这样,您就不必重复多次,如下所示:

代码语言:javascript
复制
person.name = "Tony Stark"
person.age = 52

如果块变得更长,您可能需要给this一个名称。这就是为什么引入also的原因。现在,您可以通过it或显式名称来引用接收方。如果您想在前面使用比(在本例中是person)更多的名称,这尤其有用:

代码语言:javascript
复制
val person = Person().also { newPerson ->
  newPerson.name = "Tony Stark"
  newPerson.age = 52
  // ...
}

因此,取决于代码的可读性程度,您始终可以使用其中一个或另一个。

票数 45
EN

Stack Overflow用户

发布于 2020-04-16 09:57:59

  • 这两个函数都返回接收对象本身。
  • 它们在访问接收对象方面有所不同。

你决定用哪一种。然而,在Kotlinlang的网站https://kotlinlang.org/docs/reference/scope-functions.html中,有一种使用它们的惯例

对于不更改对象的其他操作,如日志记录或打印调试信息,也可以使用。

代码语言:javascript
复制
val numbers = mutableListOf("one", "two", "three")
 numbers
     .also { println("The list elements before adding new one: $it") }
     .add("four")

apply的常见情况是对象配置。

代码语言:javascript
复制
val adam = Person("Adam").apply {
    age = 32
    city = "London"        
}
println(adam)
票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46131289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档