Kotlin范围功能与vs扩展运行

时间:2018-01-25 09:13:11

标签: kotlin kotlin-extension extension-function

根据我所学到的,似乎扩展函数T.runwith具有相同的目的,即创建在同一对象上组合多个调用的可能性,返回lambda&# 39; s最后一个对象作为结果。

T.run()具有在使用之前应用检查可空性的优势。 (正如此article指出的那样)

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

3 个答案:

答案 0 :(得分:1)

正如您所说,除了使用run进行安全调用并在链式表达式中使用它的能力之外,它们的功能相同,例如:

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

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

答案 1 :(得分: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"

我没有看到run的许多用法,而我认为with更常用。

答案 2 :(得分:0)

您可以将with放到下一行,如果您有较长的初始化程序,则可以更具可读性:

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

VS

val obj = VeryLongInitializer().DoSomething().AnotherThing().run {
    // Do stuff
}
相关问题