2016-07-21 37 views
17

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 
} 

उत्तर

19

वे run एक extension function है, जबकि with नहीं है केवल वाक्यात्मक अंतर है,।

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 का एक और अंतर्निहित तर्क है, तो तर्क प्रकारों ही कर रहे हैं: यहाँ परिभाषाएँ (kotlin-sdlib:1.0.3 में) कर रहे हैं। कार्यों के निकाय भी प्रभावी रूप से वही हैं।

उनका प्रदर्शन भी समतुल्य होना चाहिए क्योंकि inline functions दोनों हैं: परिणामी बाइटकोड में केवल block शरीर को रेखांकित होना चाहिए।


कार्यों के उपयोग में मतभेद सब तथ्य यह है कि run एक विस्तार है के कारण होता है।

पहले, run चेनिंग कॉल के लिए उपयुक्त है:

foo.run { bar }.run { baz } 

दूसरा, और अधिक महत्वपूर्ण है, अगर एक घोषित चर प्रकार समान हस्ताक्षर से run समारोह है, यह एक्सटेंशन के बजाय बुलाया जाएगा। और 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

@ साईकिरन, हां, वे पूरी तरह से अदलाबदल योग्य हैं, और उनका प्रदर्शन समान होना चाहिए क्योंकि वे दोनों 'इनलाइन' फ़ंक्शन हैं। – hotkey

1

सामान्य मामले में, वे बहुत समान हैं, लेकिन एक नल चर के लिए, यह उपयोग करने के लिए बेहतर है T.run()

जैसे यदि webview.settings शून्य है, तो नीचे

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

// similarly 
webview.settings?.run { 
    javaScriptEnabled = true 
    databaseEnabled = true 
}