从我了解到的情况来看,它似乎是扩展函数T.run
,并且with
具有相同的目的,即创建对同一对象的多个调用进行分组的可能性,并返回 lambda 的最后一个对象作为其结果。
T.run()
具有在使用它之前应用可空性检查的优点。(正如本文指出的那样)
使用有什么好处with
?或者更好地说:是什么阻止我总是使用它T.run()
?谢谢
从我了解到的情况来看,它似乎是扩展函数T.run
,并且with
具有相同的目的,即创建对同一对象的多个调用进行分组的可能性,并返回 lambda 的最后一个对象作为其结果。
T.run()
具有在使用它之前应用可空性检查的优点。(正如本文指出的那样)
使用有什么好处with
?或者更好地说:是什么阻止我总是使用它T.run()
?谢谢
正如您所说,它们的功能相同,除了可以使用run
安全调用以及在链式表达式中使用它,例如:
foo.bar().run { qwert() }
真正的区别在于语法 - 使用为您的代码提供更好可读性的语法。
许多作用域函数都是这种情况,您不能总是判断使用哪个“正确”,实际上这通常是开发人员的选择。至于with
和run
,唯一的区别是作用域函数的接收者如何发挥作用:
一方面,接收者作为参数传递给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的用法,run
我with
认为它更常用。
你可以放到with
下一行,如果你有很长的初始化程序,它会更易读:
val obj = VeryLongInitializer().DoSomething().AnotherThing()
with (obj) {
// Do stuff
}
对比
val obj = VeryLongInitializer().DoSomething().AnotherThing().run {
// Do stuff
}