2011-12-18 17 views
8

मैं स्कैला में फ़ंक्शंस की एक सरणी कैसे बना सकता हूं ताकि मैं उन पर लूप कर सकूं और गणना करने के लिए उन्हें कॉल कर सकूं?कार्यों का ऐरे?

def f1(x: Int, y: Int): Int = x + y 

def f2(x: Int, y: Int): Int = x - y 

def f3(x: Int, y: Int): Int = x * y 

def test() { 
    val someValues1 = List(1, 2) 
    val someValues2 = List(3, 4) 
    val fnList = Array(f1,f2,f3) 

    for (f <- fnList; a <- someValues1; b <- someValues2) { 
    val result = f(a, b) 
    println("Result=" + result) 
    } 
} 
+1

और आपके कार्यान्वयन में क्या गलत है? – Rogach

उत्तर

23

अपने प्रश्न में, आप कहते हैं कि तुम कार्यों की एक सरणी चाहते हैं। लेकिन आपके पूरे कोड स्निपेट में कोई भी फ़ंक्शन नहीं है!

मैं f1, f2 और f3 नामों का अनुमान लगा रहा हूं कि आपने सोचा था कि वे कार्य थे। लेकिन वे नहीं हैं: def कीवर्ड का उपयोग विधियों घोषित करने के लिए किया जाता है, फ़ंक्शन नहीं। वे दो मूल रूप से अलग हैं!

तो, आप कार्यों की एक सरणी का उपयोग करने के लिए, बस f1, f2 और f3 बनाने चाहते हैं, तो वास्तव में तरीकों के बजाय कार्यों हो:

val f1: (Int, Int) => Int = _ + _ 
val f2: (Int, Int) => Int = _ - _ 
val f3: (Int, Int) => Int = _ * _ 
वास्तव में पढ़ने के लिए

कि के लिए एक वैकल्पिक किया जाएगा त्रुटि संदेश, जो आपको बिल्कुल समस्या क्या है और इसे कैसे ठीक किया जाए:

error: missing arguments for method f1 in object $iw; 
follow this method with `_' if you want to treat it as a partially applied function 
      val fnList = Array(f1,f2,f3) 
          ^

तो, अगर आप बस क्या त्रुटि संदेश आपको बताता है कि ऐसा करने के लिए, अर्थात् _ ऑपरेटर का उपयोग कार्यों के लिए तरीकों को परिवर्तित करते हैं, सब कुछ ठीक काम करेगा:

val fnList = Array(f1 _, f2 _, f3 _) 

कारण तुम क्यों हो रही है त्रुटि संदेश है बस क्योंकि स्कैला आपको एक विधि कॉल में कोष्ठक छोड़ने की अनुमति देता है। तो, f1 का मतलब है "किसी तर्क सूची के बिना f1 पर कॉल करें", जो एक त्रुटि है, क्योंकि f1 दो तर्क लेता है।

कुछ मामलों में, जब यह वास्तव में दर्दनाक तो एकदम स्पष्ट है कि तर्क नहीं संभवतः कुछ भी लेकिन एक समारोह हो सकता है, स्काला अपने आप आपके लिए कार्य करने के लिए विधि से रूपांतरण प्रदर्शन करेंगे। तो, एक तीसरा विकल्प होगा यह दर्दनाक टूक स्काला के लिए स्पष्ट कि आप कार्यों की एक सरणी है, द्वारा, तुम्हें पता है, कार्यों की एक सरणी के रूप में यह घोषित करते हैं:

val fnList: Array[(Int, Int) => Int] = Array(f1, f2, f3) // or 
val fnList = Array[(Int, Int) => Int](f1, f2, f3) 

अब जब कि स्कैला जानता है कि fnList फ़ंक्शंस की एक श्रृंखला है, यह अब f1 पर कॉल करने का प्रयास नहीं करती है, इसके बजाय यह इसे किसी फ़ंक्शन में परिवर्तित करती है।

4

बस अपने सरणी के लिए प्रकार पैरामीटर प्रदान:

val fnList = Array[(Int,Int)=>Int](f1, f2, f3) 
7

या के रूप में लिखें:

scala> val fnList = Array(f1 _,f2 _,f3 _) 
fnList: Array[(Int, Int) => Int] = Array(<function2>, <function2>, <function2>) 
4

यह स्पष्ट नहीं है कि तुम क्या कह रहे हैं, लेकिन आप यह भी पता चला है कि

val fnList = Array[(Int,Int) => Int](_ + _, _ - _, _ * _) 

काम करता है चाहते हो सकता है।

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