Kotlin范围函数与扩展运行
从我学到的东西,它看起来像T.run
扩展函数, with
具有相同的目的,创造的可能性,在同一个对象上分组多个调用,返回lambda的最后一个对象的结果。
T.run()
具有在使用前检查可空性的优点。 (正如本文指出的那样)
使用什么优点? 或更好地说:什么阻止我总是使用T.run()
而不是? 谢谢
正如你所说的,它们的function是相同的,除了使用安全调用run
的能力以及在链式expression式中使用它的能力,例如:
foo.bar().run { qwert() }
真正的区别在于语法 – 在你的代码中为你提供更好的可读性。
对于许多范围函数来说,情况就是这样,你不能总是知道哪一个“正确”被使用,实际上往往是开发人员的选择。 至于和run
,唯一的区别是示波器function的接收器如何发挥作用:
一方面,接收者作为parameter passing给:
val s: String = with(StringBuilder("init")) { append("some").append("thing") println("current value: $this") toString() }
另一方面,直接run
在接收器上调用(扩展function):
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
用法,而我认为更常用。
你可以放在下一行,如果你有很长的初始值设定项,它可以更好的读取:
val obj = VeryLongInitializer().DoSomething().AnotherThing() with (obj) { // Do stuff }
VS
val obj = VeryLongInitializer().DoSomething().AnotherThing().run { // Do stuff }