निम्न कोड उदाहरण में, मुझे समझ में नहीं आता कि फ़ंक्शन मज़े विधि addAction
पर तर्क के रूप में क्यों पारित किया जा सकता है। विधि fun
प्रकार Unit
है, जबकि विधि addAction
() => Unit
प्रकार के फ़ंक्शन की अपेक्षा करता है।स्केल विधि प्रकार और विधियों पैरामीटर
तो fun
,, प्रकार () => Unit
की है तो क्यों संकलक शिकायत है कि fun
प्रकार Unit
की है जब मैं कार्यों की सूची पर fun
जोड़ने का प्रयास: actions = fun :: actions
?
package myscala
object MyScala {
def fun() { println("fun1 executed.") }
def addAction(a:() => Unit) {
actions = a :: actions
}
var actions: List[() => Unit] = List()
def main(args: Array[String]) {
// the following line would produce a compiler error (found: Unit, required:() => Unit), it's OK
// actions = fun :: actions
actions = (() => fun) :: actions // OK
// I would expect the same compiler error here (found: Unit, required:() => Unit), but it's OK why?
addAction(fun)
actions.foreach(_()) // prints twice "fun1 executed"
}
}
हाँ, मैं करता हूं। यह अब मुझे स्पष्ट दिखता है (यह उस समय बिल्कुल नहीं था)। जब संकलक यह अनुमान लगाने में सक्षम होता है कि फ़ंक्शन प्रकार की अपेक्षा की जाती है, तो मैं बस 'मजेदार' लिख सकता हूं, अन्यथा मुझे यह स्पष्ट करना होगा कि मैं एक फ़ंक्शन पास कर रहा हूं। आप सभी के स्पष्ट जवाब के लिए धन्यवाद! – Manu
@ मॅनू: एक उत्तर स्वीकार करने पर विचार करें जिसे आप सबसे अच्छा मानते हैं (यह आवश्यक नहीं है) –