根据我所学到的,似乎扩展函数T.run
和with
具有相同的目的,即创建在同一对象上组合多个调用的可能性,返回lambda&# 39; s最后一个对象作为结果。
T.run()
具有在使用之前应用检查可空性的优势。 (正如此article指出的那样)
使用with
有什么好处?或更好地说:是什么阻止我总是使用T.run()
代替?
感谢
答案 0 :(得分:1)
正如您所说,除了使用run
进行安全调用并在链式表达式中使用它的能力之外,它们的功能相同,例如:
foo.bar().run { qwert() }
真正的区别在于语法 - 使用哪种方式为您提供更好的代码可读性。
答案 1 :(得分:1)
对于许多范围函数来说就是这种情况,你不能总是知道哪一个是“正确的”使用,它实际上是开发人员的选择。对于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"
我没有看到run
的许多用法,而我认为with
更常用。
答案 2 :(得分:0)
您可以将with
放到下一行,如果您有较长的初始化程序,则可以更具可读性:
val obj = VeryLongInitializer().DoSomething().AnotherThing()
with (obj) {
// Do stuff
}
VS
val obj = VeryLongInitializer().DoSomething().AnotherThing().run {
// Do stuff
}