我希望为每个函数运行一个很好的例子,让,应用,还有
我读过这篇文章,但仍然缺乏一个例子
所有这些函数都用于切换当前函数/变量的范围。它们用于将属于一起的事物保存在一个地方(主要是初始化)。
这里有些例子:
run- 返回你想要的任何东西并重新定义它用于的变量this
run
this
val password: Password = PasswordGenerator().run { seed = "someString" hash = {s -> someHash(s)} hashRepetitions = 1000 generate() }
密码生成器现在被重新定义为this,因此我们可以设置seed,hash而hashRepetitions无需使用变量。 generate()将返回Password.
seed
hash
hashRepetitions
generate()
Password
apply是相似的,但它会返回this:
apply
val generator = PasswordGenerator().apply { seed = "someString" hash = {s -> someHash(s)} hashRepetitions = 1000 } val pasword = generator.generate()
这对于替代 Builder 模式特别有用,并且如果您想重用某些配置。
let- 主要用于避免空检查,但也可以用作run. 不同之处在于,这this仍然与以前相同,并且您可以使用以下方式访问重新作用域的变量it:
let
it
val fruitBasket = ... apple?.let { println("adding a ${it.color} apple!") fruitBasket.add(it) }
只有当它不为空时,上面的代码才会将苹果添加到篮子中。另请注意,it现在 不再是可选的, 因此您不会在这里遇到 NullPointerException(也就是您不需要使用?.它来访问其属性)
?.
also- 想用的时候用apply,又不想遮遮掩掩this
also
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指的是苹果,而 不是 水果篮。
this.weight
注意:我无耻地从我的博客中获取示例