2016-07-21 4 views
17

Do withrunは同じシンタックスで同じ機能を持ちますか、withrunの間に大きな違いがありますか?コトルでの実行と実行の違い

どちらが適切な方法ですか? withがいない間

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 
} 

答えて

19

彼らは唯一の構文的な違いを持っ​​て、runextension functionです。ここで(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は拡張関数であるので、それはタイプTのもう一つの暗黙の引数を持っているので、引数の型が同じです。関数の本体も事実上同じです。

両方ともinline functionsであるため、パフォーマンスも同等である必要があります。結果のバイトコードには、インラインのblockボディのみを含める必要があります。


機能の使用法の違いは、すべてrunが拡張であることが原因です。

まず、runは、連鎖呼び出しに適しています:宣言した変数の型が同じシグネチャを持つrun機能を有していれば

foo.run { bar }.run { baz } 

第二に、そしてより重要なは、それは代わりに拡張子を呼び出されます。 runは、別の内線番号でシャドーできます。これはhow extensions are resolvedです。例:通常の場合には

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" 
+0

です線量はどちらもアプリケーションのパフォーマンスに影響しますか? –

+0

@SaiKiranはい、彼らは完全に互換性があり、両方のインライン関数であるので、それらの性能は同じでなければなりません。 – hotkey

1

、彼らはかなり似ていますが、NULL可能変数のために、それは例えばT.run()

を使用することをお勧めしますwebview.settingsがヌル入力可能な場合は、下に別名が表示されます

with(webview.settings) { 
    this?.javaScriptEnabled = true 
    this?.databaseEnabled = true 
} 

// similarly 
webview.settings?.run { 
    javaScriptEnabled = true 
    databaseEnabled = true 
} 
関連する問題