1

从我了解到的情况来看,它似乎是扩展函数T.run,并且with具有相同的目的,即创建对同一对象的多个调用进行分组的可能性,并返回 lambda 的最后一个对象作为其结果。

T.run()具有在使用它之前应用可空性检查的优点。(正如本文指出的那样)

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

4

3 回答 3

1

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

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

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

于 2018-01-25T09:18:44.880 回答
1

许多作用域函数都是这种情况,您不能总是判断使用哪个“正确”,实际上这通常是开发人员的选择。至于withrun,唯一的区别是作用域函数的接收者如何发挥作用:

一方面,接收者作为参数传递给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"

我没有看到很多while的用法,runwith认为它更常用。

于 2018-01-25T09:32:10.917 回答
0

你可以放到with下一行,如果你有很长的初始化程序,它会更易读:

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

对比

val obj = VeryLongInitializer().DoSomething().AnotherThing().run {
    // Do stuff
}
于 2018-01-25T19:23:08.927 回答