Kotlin 范围函数与 vs 扩展 运行

Kotlin scope functions with vs extension run

据我所知,扩展函数 T.runwith 似乎具有相同的目的,即创建对同一对象进行多次调用的可能性,返回 lambda 的最后一个对象作为结果。

T.run() 的优点是在使用前检查是否为空。 (正如这个 article 指出的那样)

使用with有什么好处?或者更好的说法是:是什么阻止我总是使用 T.run()? 谢谢

正如您所说,它们的功能相同,除了可以使用 run 进行安全调用,并在链式表达式中使用它,例如:

foo.bar().run { qwert() }

真正的区别在于语法 - 使用可为您的代码提供更好可读性的语法。

很多作用域函数都是这种情况,你不能总是告诉"correct"要使用哪个,实际上通常是开发人员的选择。至于withrun,唯一的区别是scope函数的receiver是如何发挥作用的:

一方面,接收者作为参数传递给with:

val s: String = with(StringBuilder("init")) {
    append("some").append("thing")
    println("current value: $this")
    toString()
}

另一方面,run 直接在接收器上调用(扩展函数):

val s: String = StringBuilder("init").run {
    append("some").append("thing")
    println("current value: $this")
    toString()
} 

run 具有可空性处理的优势,因为可以应用安全运算符:

val s: String = nullableSB?.run {
   //...
} ?: "handle null case"

我没有看到 run 的很多用法,而 with 我认为更常用。

你可以把 with 放在下一行,如果你有长的初始化程序,这样会更易读:

val obj = VeryLongInitializer().DoSomething().AnotherThing()
with (obj) {
    // Do stuff
}

val obj = VeryLongInitializer().DoSomething().AnotherThing().run {
    // Do stuff
}