2011-10-28 13 views
11

के रूप में इस प्रकार हैस्कैला 0 पैरामीटर, बदसूरत वाक्यविन्यास के साथ एक शून्य समारोह लौट रहा है?

def descendEach(times:Int)(f:()=>Unit) { 
     for (i <- 1 to times) { 
      // other code 
      f() 
     } 
    } 

मैं लेकिन

gd.descendEach(20){ 
    println(gd.cost) 
} 

लिखने के लिए सक्षम होने के लिए स्केला संकलक केवल मेरे साथ दूर प्राप्त करने देता है चाहता हूँ जब मैं इस विधि का उपयोग एक विधि परिभाषित देखते हुए

gd.descendEach(20){() => 
    println(gd.cost) 
} 

जो बदसूरत है। क्या मुझसे कोई चूक हो रही है? क्या मैंने इसे प्रस्तुत करने के पहले तरीके से लिखना संभव है?

उत्तर

21

निम्न सिंटैक्स का उपयोग करें:

def descendEach[T](times:Int)(f: => T) 

इस तरह आप केवल बिना अतिरिक्त () => समारोह पारित नहीं हो सकता है (यह नाम द्वारा पारित कहा जाता है), लेकिन यह भी किसी भी प्रकार के लौटने कार्यों का उपयोग (जरूरी नहीं कि Unit) ।

def g() = 42 
descendEach(20)(g) 

ध्यान दें कि यह वाक्य रचना के साथ आप बस f उपयोग कर रहे हैं, नहीं f(): यह कभी कभी सुविधाजनक जब आप मौजूदा समारोह आप पास करना चाहते है, लेकिन इसकी वापसी मान के बारे में वास्तव में परवाह नहीं है है।

+2

धन्यवाद टॉमसज़, जिसने इसे ठीक किया। मेरे उदाहरण के लिए, बस 'f: => यूनिट' भी काम करता है, लेकिन जेनेरिक संस्करण जानना आसान है। – npiv

संबंधित मुद्दे