小编典典

我们何时应该在 Kotlin 上使用 run、let、apply、also 和 with 的示例

all

我希望为每个函数运行一个很好的例子,让,应用,还有

我读过这篇文章,但仍然缺乏一个例子


阅读 139

收藏
2022-08-05

共1个答案

小编典典

所有这些函数都用于切换当前函数/变量的范围。它们用于将属于一起的事物保存在一个地方(主要是初始化)。

这里有些例子:

run- 返回你想要的任何东西并重新定义它用于的变量this

val password: Password = PasswordGenerator().run {
       seed = "someString"
       hash = {s -> someHash(s)}
       hashRepetitions = 1000

       generate()
   }

密码生成器现在被重新定义为this,因此我们可以设置seedhashhashRepetitions无需使用变量。
generate()将返回Password.

apply是相似的,但它会返回this

val generator = PasswordGenerator().apply {
       seed = "someString"
       hash = {s -> someHash(s)}
       hashRepetitions = 1000
   }
val pasword = generator.generate()

这对于替代 Builder 模式特别有用,并且如果您想重用某些配置。

let- 主要用于避免空检查,但也可以用作run.
不同之处在于,这this仍然与以前相同,并且您可以使用以下方式访问重新作用域的变量it

val fruitBasket = ...

apple?.let {
  println("adding a ${it.color} apple!")
  fruitBasket.add(it)
}

只有当它不为空时,上面的代码才会将苹果添加到篮子中。另请注意,it现在 不再是可选的, 因此您不会在这里遇到
NullPointerException(也就是您不需要使用?.它来访问其属性)

also- 想用的时候用apply,又不想遮遮掩掩this

class FruitBasket {
    private var weight = 0

    fun addFrom(appleTree: AppleTree) {
        val apple = appleTree.pick().also { apple ->
            this.weight += apple.weight
            add(apple)
        }
        ...
    }
    ...
    fun add(fruit: Fruit) = ...
}

在这里使用apply会 shadow this,所以this.weight指的是苹果,而 不是 水果篮。


注意:我无耻地从我的博客中获取示例

2022-08-05