2016-01-21 6 views
5

में एक करीबी फ़ंक्शन के साथ नामित पैरामीटर का उपयोग कैसे करें मेरे पास 4 पैरामीटर के साथ एक विधि है जो ब्लॉक में उपयोग की जाती है। प्रत्येक ब्लॉक के भीतर, पहले पैरामीटर हमेशा एक ही है:स्कैला

// Block 1 - first parameter always "A" 
foo(a="A", b="x", c="y", d="z") 
foo(a="A", b=".", c=",", d="-") 
foo(a="A", b="1", c="2", d="3") 

// Block 2 - first parameter always "B" 
foo(a="B", b="x", c="y", d="z") 
foo(a="B", b=".", c=",", d="-") 
foo(a="B", b="1", c="2", d="3") 

मैं एक त्वरित तरीका प्रत्येक ब्लॉक के लिए एक विधि बनाने के लिए इतना है कि मैं केवल एक अन्य 3 पैरामीटर निर्दिष्ट करने की जरूरत है चाहता हूँ। वर्तमान में मैं यह कर सकता हूं:

def fooCurried(a: String) = foo(a, _: String, _: String, _: String) 

val fooA = fooCurreid("A") 
fooA("x", "y", "z") 
fooA(".", ",", "-") 
fooA("1", "2", "3") 

val fooB = fooCurried("B") 
fooB("x", "y", "z") 
fooB(".", ",", "-") 
fooB("1", "2", "3") 

इस दृष्टिकोण के साथ समस्या यह है कि मैं अपने नामित पैरामीटर खो देता हूं। वे v1, v2 और v3 बन गए। इस मामले में नामित पैरामीटर का उपयोग करना महत्वपूर्ण है क्योंकि अन्य 3 पैरामीटर के प्रकार समान हैं और इसलिए मिश्रण करना आसान है।

क्या ऊपर fooCurried फ़ंक्शन को परिभाषित करने का एक साफ तरीका है जिसे मैं आसानी से विभिन्न संदर्भों में उपयोग कर सकता हूं लेकिन मुझे नामित पैरामीटर का उपयोग करने देता है? पहले से

def fooCurried(a: String) = ??? 

val fooA = fooCurreid("A") 
fooA(b="x", c="y", d="z") 
fooA(b=".", c=",", d="-") 
fooA(b="1", c="2", d="3") 

धन्यवाद:

मैं कुछ मैं इस तरह उपयोग कर सकते हैं चाहते हैं!

+2

ठीक है, मैं यह currying नहीं आंशिक आवेदन है कहेंगे। यदि आप इसे घुमाने के लिए चाहते थे तो आप इसे उदा। 'def foo (a: स्ट्रिंग) (बी: स्ट्रिंग, सी: स्ट्रिंग, डी: स्ट्रिंग) = ???'। –

+0

@MateuszKubuszok हां गलत शब्दावली का उपयोग करने के लिए खेद है। इस मामले में मैं 'foo' को नियंत्रित नहीं करता हूं इसलिए मैं आपके द्वारा सुझाए गए प्रारूप का उपयोग करके इसे बदल नहीं सकता। हालांकि मैं एक रैपर बना सकता था। – rmin

उत्तर

4

कैसे इस बारे में:

case class fooCurried(a: String) { 
    def apply(b: String, c: String, d: String) = { 
    // do something 
    println(a + "," + b + "," + c + "," + d) 
    } 
} 

आप इसे इस तरह उपयोग कर सकते हैं:

scala> val fooA = fooCurried(a = "A") 
fooA: fooCurried = fooCurried(A) 

scala> fooA(b="B", c="C", d="D") 
A,B,C,D 

scala> fooA(b="x", c="y", d="z") 
A,x,y,z 
+0

यह एक महंगा अज्ञात वर्ग से भी बचाता है – Clashsoft

+0

@Clashsoft क्या आप महंगे अज्ञात वर्ग से बचकर अपने मतलब का विस्तार कर सकते हैं? – rmin

1

एक वैकल्पिक तरीका है जहाँ आप case class उपयोग कर रहा है कर सकते हैं:

case class Foo(a:String, b:String, c:String) 

val f = Foo(a="a", b="b", c="c") 
foo(f.copy(b ="b1", c="c1")) 

लेकिन फिर अपने foo 4 कई तार के बजाय तर्क के रूप में एक वर्ग ले जाएगा।