2010-01-18 5 views
5

मान लें कि मेरे पास पैरामीटर के रूप में एक और विधि की अपेक्षा करने की विधि है। क्या उस पैरामीटर के लिए ऑब्जेक्ट के इंस्टेंस विधियों को भेजना संभव है? मैं उन विधियों को कैसे संभाल सकता हूं जिनमें कोई पैरामीटर नहीं है?क्या मैं स्केल में कॉलबैक की अपेक्षा करने वाली विधि के लिए किसी ऑब्जेक्ट की इंस्टेंस विधि को पास कर सकता हूं?

मैं कुछ स्यूडोकोड लिखेंगे:

void myMethod1(callback<void,int> otherFunc); // imagine a function returning void, and taking a int parameter 

void myMethod2(callback<int,void> otherFunc); // function returning void, not taking params 

अगर उदाहरण के लिए मैं एक ArrayList, इस तरह है:

val a = new ArrayList() 

मैं कैसे भेज सकता है यह myMethod1 के लिए पैरामीटर के रूप में add विधि है, और यह है myMethod2 के लिए पैरामीटर के रूप में विधि?

+2

यह जानते हैं और यह ध्यान रखें कि स्काला तरीकों और कार्यों में बहुत हैं के लिए महत्वपूर्ण है अलग अलग बातें। तरीके प्रथम श्रेणी की संस्था नहीं हैं, लेकिन कार्य हैं। इस प्रकार (प्रतिबिंब अलग), कोई विधि पैरामीटर के रूप में कोई अन्य विधि नहीं लेती है। आंशिक अनुप्रयोग का उपयोग किसी भी तरीके या कार्यों के साथ किया जा सकता है और हमेशा एक समारोह उत्पन्न करता है। –

उत्तर

4

मुझे लगता है कि myMethod4 क्या हो सकता है जब आप कहें: "क्या किसी भी आकार का संदर्भ देना संभव नहीं है और जब भी आवश्यक हो उसे आमंत्रित करें?"।

def myMethod1(f: Int => Unit): Unit = f(1) 

def myMethod2(f:() => Int): Unit = { 
    val value = f // f is function, taking no arguments, and returning an int. 
       // we invoke it here. 
() 
} 

def myMethod3(f: => Int): Unit = { 
    val value = f // f is call by name parameter. 
() 
} 

def myMethod4[A](f: A => Int, a: A): Unit = { 
    val value = f(a) 
() 
} 

import java.util.ArrayList 

val a = new ArrayList[Int](1) 
myMethod1((i: Int) => a.add(i)) 
myMethod1(a.add(_))  // shorthand for the above 
myMethod2(() => a.size) // a.size is not evaluated, it is enclosed in an anonymous function definition. 
myMethod3(a.size)  // a.size is not evaluated here, it is passed as a by-name parameter. 
myMethod4((al: ArrayList[Int]) => al.size, a) 
myMethod4((_: ArrayList[Int]).size, a) 
myMethod4[ArrayList[Int]](_.size, a) 
+0

क्या आप कृपया बता सकते हैं कि खाली पैराथेस विधि 2/3/4 में कैसे काम करते हैं? – Geo

+1

एक ब्लॉक '{ए; ख; सी} में अभिव्यक्तियों और घोषणाओं का एक अनुक्रम होना चाहिए (var, val, class, function, trait, ऑब्जेक्ट)। यह एक अभिव्यक्ति के साथ खत्म होना चाहिए। स्पष्टता के लिए, मैंने 'f' के परिणाम को वैल' मान' पर असाइन किया है, इसलिए मुझे इस अभिव्यक्ति के साथ इसका पालन करने की आवश्यकता है जो ब्लॉक के अपेक्षित प्रकार के अनुरूप है, जो इस मामले में फ़ंक्शन का घोषित प्रकार है: ' Unit'। '()' प्रकार 'यूनिट' का एकमात्र उदाहरण है। एक खाली 'वापसी' भी काम करेगा। जैसा कि किसी अन्य प्रकार की अभिव्यक्ति होगी, क्योंकि किसी भी मान को 'यूनिट' टाइप करने के लिए परिवर्तित किया जा सकता है। – retronym

4
def myMethod(callback : Int => Unit, size : => Int) = ... 

myMethod(a.add _, a.size) 

Void प्रकार Unit के माध्यम से प्रतिनिधित्व किया है।

संपादित करें: उपरोक्त उपयोग के माध्यम से => Int, size नाम से पारित किया गया है जिसका अर्थ है कि जब आवश्यक हो तो इसका हमेशा मूल्यांकन किया जाता है।

+0

क्या 'a.size' को संदर्भित करना संभव नहीं है और जब भी आवश्यक हो उसे आमंत्रित करें? – Geo

+0

क्या आपका मतलब गुजरने का मतलब है: नाम से Int? def myMethod (कॉलबैक: Int => यूनिट, आकार: => Int) – davetron5000

5

स्काला में एक समारोह के प्रकार

(Types,To,Pass) => ReturnType 

निरूपित किया जाता है (यदि आप कोष्ठक बंद छोड़ सकते हैं अगर वहाँ पारित करने के लिए केवल एक ही प्रकार है), और जिस तरह से एक में एक विधि कन्वर्ट करने के लिए एक और तरीका करने के लिए पारित करने के लिए समारोह

तो है myObject.myMethod _, इन एक साथ डाल - और जावा वर्गों के प्रकार पर ध्यान दे:

scala> def addMySize(adder: Int => Boolean, sizer:() => Int) = adder(sizer()) 
addMySize: ((Int) => Boolean,() => Int)Boolean 

scala> val a = new java.util.ArrayList[Int]() 
a: java.util.ArrayList[Int] = [] 

scala> addMySize(a.add _, a.size _) 
res0: Boolean = true 

scala> addMySize(a.add _, a.size _) 
res1: Boolean = true 

scala> println(a) 
[0, 1] 

(ध्यान दें कि ArrayList एक ऐड है कि एक वस्तु लेता है और एक बूलियन देता है -। नहीं एक है कि शून्य रिटर्न)

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

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