वे 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"
दिखाएगा तो मैं उपयोगकर्ता भी कर सकता हूं। खुराक दोनों के आवेदन पर प्रदर्शन पर कोई प्रभाव पड़ता है? –
@ साईकिरन, हां, वे पूरी तरह से अदलाबदल योग्य हैं, और उनका प्रदर्शन समान होना चाहिए क्योंकि वे दोनों 'इनलाइन' फ़ंक्शन हैं। – hotkey