let和runKotlin作用域函数的区别

d7v8vwbk  于 2023-10-23  发布在  Kotlin
关注(0)|答案(2)|浏览(94)

如果我们可以使用let来避免空指针异常,为什么我们需要run函数?
有些文章说runwithlet的组合,但如果单独使用let就足够了,那么引入run函数的意义何在?

vptzau2j

vptzau2j1#

当您尝试使用letrun时,主要区别在于它们如何公开其目标。
let使用it关键字公开对象,而run使用this关键字公开对象,这使得对象属性和方法在上下文中可用,并且您不再需要编写this来引用它们。与let相反,在let中,每次要调用目标对象的属性或方法时,都必须重复it
请查看此文档链接以了解差异以及不能使用let而应使用run的情况。

rsl1atfo

rsl1atfo2#

你是正确的,你可以使用let来避免空指针异常,但let本身是不够的。帮助您避免NPE的是?.操作符(在此处记录)。这有助于使你的代码更简洁:而不是

if (foo != null)
    foo.bar()

你可以做

foo?.bar()

(To准确地说,?.运算符的直接转换将是if (foo == null) null else foo.bar(),但我们经常丢弃null情况。
现在,将其与let函数结合使用,可以使看起来复杂的代码更加简洁(并且可能更具可读性)。而不是:

val foo = getMeSomeFoo()
if (foo != null) {
    doSomething(foo)
    return foo.bar()
} else {
    return null
}

你可以做

return getMeSomeFoo()?.let { foo ->
    doSomething(foo)
    foo.bar()
}

{...}内部的代码被称为let函数的 block 参数,而block是另一个函数(或lambda),它接受let的接收器(在本例中,如果它不为null,则为getMeSomeFoo())作为参数,我们在lambda中将此参数命名为foo。对于短块,可以省略foo ->,而使用默认名称it
let函数是几个所谓的scope functions函数之一。你也可以用同样的方式使用run,但是你必须使用this来代替it。然而,let在这种用法中更常见和惯用。
我做了这个作用域函数表,我发现它是一个有用的参考:
| | 返回y| Return y |
| --|--|--|
|这个| x.应用{ y }|x.run { y }其中(x){ y }|
|| x.也是{ y }| x.let { y }|
| - |运行{ y }| run { y } |

相关问题