不要with
和run
有唯一不同的语法相同的功能,或者是有之间的主要差异with
和run
?
哪种方法适当?
adapter.run {
notifyDataSetChanged()
if (activityDetails.isEmpty())
emptyText.visibility = View.VISIBLE
else
emptyText.visibility = View.GONE
}
with(adapter){
notifyDataSetChanged()
if (activityDetails.isEmpty())
emptyText.visibility = View.VISIBLE
else
emptyText.visibility = View.GONE
}
Run Code Online (Sandbox Code Playgroud)
hot*_*key 32
它们只有语法差异,run
是扩展函数,而with
不是.以下是定义(in kotlin-sdlib:1.0.3
):
public inline fun <T, R> T.run(block: T.() -> R): R = block() // equivalent to this.block()
public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()
Run Code Online (Sandbox Code Playgroud)
由于run
是一个扩展函数,它还有一个类型的隐式参数T
,因此参数类型是相同的.功能的主体也实际上是相同的.
它们的性能也应该是等价的,因为它们都是inline
函数:结果字节码应该只包含内联block
体.
功能使用的差异都是由run
扩展的事实引起的.
一,run
适用于通话链接:
foo.run { bar }.run { baz }
Run Code Online (Sandbox Code Playgroud)
其次,更重要的是,如果声明的变量类型具有run
相同签名的函数,则将调用它而不是扩展名.并且run
可以被另一个扩展阴影.这就是扩展的解决方法.例:
class MyClass {
fun <R> run(blockIgnored: MyClass.() -> R): Nothing = throw RuntimeException()
}
"abcdefg".run { println("x") } // prints "x"
MyClass().run { println("x") } // throws RuntimeException
(MyClass() as Any).run { println("x") } // prints "x"
Run Code Online (Sandbox Code Playgroud)
通常情况下,它们非常相似,但是对于可为空的变量,最好使用 T.run()
例如,如果可以webview.settings
为空,则下面将显示
with(webview.settings) {
this?.javaScriptEnabled = true
this?.databaseEnabled = true
}
// similarly
webview.settings?.run {
javaScriptEnabled = true
databaseEnabled = true
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3688 次 |
最近记录: |