Kotlin 范围函数与 vs 扩展 运行
Kotlin scope functions with vs extension run
据我所知,扩展函数 T.run
和 with
似乎具有相同的目的,即创建对同一对象进行多次调用的可能性,返回 lambda 的最后一个对象作为结果。
T.run()
的优点是在使用前检查是否为空。 (正如这个 article 指出的那样)
使用with
有什么好处?或者更好的说法是:是什么阻止我总是使用 T.run()
?
谢谢
正如您所说,它们的功能相同,除了可以使用 run
进行安全调用,并在链式表达式中使用它,例如:
foo.bar().run { qwert() }
真正的区别在于语法 - 使用可为您的代码提供更好可读性的语法。
很多作用域函数都是这种情况,你不能总是告诉"correct"要使用哪个,实际上通常是开发人员的选择。至于with
和run
,唯一的区别是scope函数的receiver是如何发挥作用的:
一方面,接收者作为参数传递给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
我认为更常用。
你可以把 with
放在下一行,如果你有长的初始化程序,这样会更易读:
val obj = VeryLongInitializer().DoSomething().AnotherThing()
with (obj) {
// Do stuff
}
对
val obj = VeryLongInitializer().DoSomething().AnotherThing().run {
// Do stuff
}
据我所知,扩展函数 T.run
和 with
似乎具有相同的目的,即创建对同一对象进行多次调用的可能性,返回 lambda 的最后一个对象作为结果。
T.run()
的优点是在使用前检查是否为空。 (正如这个 article 指出的那样)
使用with
有什么好处?或者更好的说法是:是什么阻止我总是使用 T.run()
?
谢谢
正如您所说,它们的功能相同,除了可以使用 run
进行安全调用,并在链式表达式中使用它,例如:
foo.bar().run { qwert() }
真正的区别在于语法 - 使用可为您的代码提供更好可读性的语法。
很多作用域函数都是这种情况,你不能总是告诉"correct"要使用哪个,实际上通常是开发人员的选择。至于with
和run
,唯一的区别是scope函数的receiver是如何发挥作用的:
一方面,接收者作为参数传递给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
我认为更常用。
你可以把 with
放在下一行,如果你有长的初始化程序,这样会更易读:
val obj = VeryLongInitializer().DoSomething().AnotherThing()
with (obj) {
// Do stuff
}
对
val obj = VeryLongInitializer().DoSomething().AnotherThing().run {
// Do stuff
}