2012-11-22 14 views
6

मैं एक समारोहवैरैडिक तर्कों के साथ फ़ंक्शन को कॉल करने के लिए स्कैला वाक्यविन्यास क्या है लेकिन नामांकित तर्कों के साथ?

def f(a:Int = 0, b:String = "", c:Float=0.0, foos: Foo*) { ... } 

सूचना कुछ मानकों के लिए डिफ़ॉल्ट तर्क का उपयोग किया है कहो। आमतौर पर, मूलभूत मूल्यों का उपयोग करना, तुम इतनी तरह नामित मानकों के साथ एक समारोह आह्वान:

val foo = Foo("Foo!") 
f(foos = foo) 

इस वाक्य रचना काम करता है क्योंकि मैं केवल एक foo साथ विधि लागू कर रहा हूँ। हालांकि, अगर मेरे पास दो या अधिक

val foo1 = Foo("Foo!") 
val foo2 = Foo("Bar!") 
f(foos = ...) 

यह इतना स्पष्ट नहीं है कि यहां क्या खिलाया जाना चाहिए। Seq(foo1,foo2) और Seq(foo1,foo2):_* चेक टाइप न करें।

और क्या है, मैं इसे foo एस के साथ कैसे कॉल कर सकता हूं?

// All out of foos! 
f(foos = ...) 

इस मामले के लिए, खाली कोष्ठकों (f()) के साथ समारोह काम नहीं करता है बुला।

धन्यवाद!

+0

स्केल का कौन सा संस्करण आप उपयोग कर रहे हैं? आरपीएल में एफ को परिभाषित करने का प्रयास 2.9.2 के साथ मुझे ": 9: त्रुटि: एक * * 'के साथ पैरामीटर अनुभाग - पैरामीटर को डिफ़ॉल्ट तर्क होने की अनुमति नहीं है" –

+0

मैं इसे 2.9.2 पर देख रहा हूं कुंआ। हालांकि, मैं जिस वास्तविक कोड को संकलित कर रहा हूं वह 2.9.1 चल रहा है, जहां स्पष्ट रूप से यह कानूनी है। – fatuhoku

उत्तर

7

को देखते हुए स्काला 2.9 सीमाओं कि पाओलो उल्लेख किया है, तो आप अभी भी विभिन्न वर्गों में विभाजित करने के लिए मापदंडों currying उपयोग कर सकते हैं, एक जो डिफ़ॉल्ट तर्कों के साथ नामित पैरामीटर का उपयोग करता है, और एक varargs के लिए (या एकाधिक curried तर्क खंड यदि आप एक से अधिक vararg पैरामीटर चाहते हैं)। पठनीयता के संबंध में परिणाम केवल नामित तर्कों का उपयोग करने से लगभग बेहतर है:

f(b="something")() 
f(c=3.14)(foo1, foo2) 
+0

यह वास्तव में एक अच्छा विचार है, धन्यवाद! – fatuhoku

+0

मैं सहमत हूं, यह अच्छा लग रहा है! –

8

डिफ़ॉल्ट पैरामीटर के लिए, अपने प्रश्न पर मेरी टिप्पणी देखें। के लिए कि कैसे एक नामित तर्क के साथ variadic हिस्सा कॉल करने के लिए नीचे दिए गए (स्केला 2.9.2) देखें:

scala> case class Foo(a:Int) 
defined class Foo 

scala> def f(a:Int, foos: Foo*) = foos.length 
f: (a: Int, foos: Foo*)Int 

scala> f(a=2, foos=Foo(2)) 
res0: Int = 1 

// I'm not sure if this is cheating... 
// am I just naming the first of the two variadic arguments? 
scala> f(a=2, foos=Foo(2),Foo(3)) 
res1: Int = 2 

//anyway you can do .... 
scala> f(a=2, foos=Seq(Foo(1), Foo(2)):_*) 
res2: Int = 2 

// with no foos... 
scala> f(a=2, foos=Nil:_*) 
res3: Int = 0 
+0

धन्यवाद, यह काफी स्पष्ट बनाता है। मैं आपका जवाब स्वीकार करने जा रहा हूं क्योंकि यह प्रश्न के प्रति अधिक निकटता से मेल खाता है, हालांकि व्यावहारिकता के मामले में मुझे लगता है कि मैं ब्लूएंटे 10 के दृष्टिकोण को अपनाऊंगा। – fatuhoku

+0

@fatu मुझे पता है कि मेरा जवाब [तकनीकी रूप से सही] है (www.deadprogrammer.com/technically-correct /) ... मुझे यह भी लगता है कि ब्लूएंटे 10 का दृष्टिकोण बेहतर है और सही का एक और उपयोगी ब्रांड है। आप अभी भी मेरा स्वीकार नहीं कर सकते हैं और उसका जवाब स्वीकार कर सकते हैं। –

+0

हाहा, ठीक है, जैसा आप चाहें। – fatuhoku

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