क्या वर्क-पैरामीटर में निहित कार्यों को कॉल करना संभव है?एक vararg-पैरामीटर से फ़ंक्शन कैसे कॉल करें?
def perform(functions:() => Unit*) = ?
क्या वर्क-पैरामीटर में निहित कार्यों को कॉल करना संभव है?एक vararg-पैरामीटर से फ़ंक्शन कैसे कॉल करें?
def perform(functions:() => Unit*) = ?
हाँ, बहुत संभव:
>> def perform(functions:() => Unit*) = for (f <- functions) f()
>> perform(() => println("hi"),() => println("bye"))
hi
bye
perform: (functions:() => Unit*)Unit
याद रखें कि बार-बार मापदंडों Seq[TheType]
के रूप में संपर्क में हैं। इस मामले में, Seq[() => Unit]
, हालांकि यह दिखता है जैसे *
की उच्च प्राथमिकता होनी चाहिए, लेकिन ऐसा नहीं है।
ध्यान दें कि कोष्ठक का उपयोग कर एक ही प्रकार की पैदावार:
>> def perform(functions:(() => Unit)*) = for (f <- functions) f()
perform: (functions:() => Unit*)Unit
मुबारक कोडिंग।
@pst ने आपको जवाब दिया, मैं बस भविष्य के संदर्भ के लिए एक और बिट जोड़ रहा हूं। आप आरईपीएल
मेंperform(fcts) // this does not compile
काम नहीं करेगा इस पर अमल करने का प्रयास करें
val fcts = List(() => println("I hate"),() => println("this"))
:
के आप अपने आप को कार्यों की निम्न संग्रह के साथ लगता है मान लीजिए।
आप संकलक है कि क्या तुम सच में प्राप्त करने के लिए कोशिश कर रहे हैं एक जावा सरणी के रूप में पारित करने के लिए सूची
perform(fcts : _*) // works.
जाहिर है (यह कैसे varargs बाईटकोड में प्रतिनिधित्व कर रहे हैं है) है, के लिए यह पकड़ बता सकते हैं लेकिन किसी भी स्कैला संग्रह, न सिर्फ सूची।
रुबी में, हम तर्कों को "छेड़छाड़" कहते हैं। –