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 }