Kotlin与之间的差异

Sai*_*Sai 28 kotlin

不要withrun有唯一不同的语法相同的功能,或者是有之间的主要差异withrun

哪种方法适当?

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)

  • @SaiKiran,是的,它们是完全可互换的,并且它们的性能应该相同,因为它们都是内联函数。 (2认同)

Ely*_*lye 6

通常情况下,它们非常相似,但是对于可为空的变量,最好使用 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)