2010-05-14 5 views
28

यहाँ कुछ मैं जावा में कर सकते हैं, एक दोहराया पैरामीटर के परिणाम लेने के लिए और यह एक और तरीका करने के लिए पारित:स्कैला में क्या मैं अन्य तरीकों से बार-बार पैरामीटर पास कर सकता हूं?

public void foo(String ... args){bar(args);} 
public void bar(String ... args){System.out.println("count="+args.length);} 
स्केला में

इसे इस तरह दिखेगा:

def foo(args:String*) = bar(args) 
def bar(args:String*) = println("count="+args.length) 

लेकिन इस जीत संकलित नहीं है, बार हस्ताक्षर व्यक्तिगत तारों की एक श्रृंखला की अपेक्षा करता है, और इसमें दर्ज तर्क कुछ गैर-स्ट्रिंग संरचना है।

अभी के लिए मैं बस सरणी के चारों ओर गुजर रहा हूँ। तारांकित पैरामीटर का उपयोग करना बहुत अच्छा होगा। क्या ऐसा करने का कोई तरीका है?

उत्तर

46

जावा एक धारणा बनाता है कि आप स्वचालित रूप से ऐरे args को varargs में कनवर्ट करना चाहते हैं, लेकिन यह ऑब्जेक्ट्स के varargs को स्वीकार करने वाले तरीकों से समस्याग्रस्त हो सकता है।

स्कैला को : _* के साथ तर्क को निर्दिष्ट करके स्पष्ट होना आवश्यक है।

scala> def bar(args:String*) = println("count="+args.length) 
bar: (args: String*)Unit 

scala> def foo(args:String*) = bar(args: _*) 
foo: (args: String*)Unit 

scala> foo("1", "2") 
count=2 

आप Seq के किसी भी उप-प्रकार पर : _* का उपयोग करें, या कुछ भी परोक्ष, एक Seq को convertable विशेष रूप से Array पर कर सकते हैं।

scala> def foo(is: Int*) = is.length 
foo: (is: Int*)Int 

scala> foo(1, 2, 3) 
res0: Int = 3 

scala> foo(Seq(1, 2, 3): _*) 
res1: Int = 3 

scala> foo(List(1, 2, 3): _*) 
res2: Int = 3 

scala> foo(Array(1, 2, 3): _*) 
res3: Int = 3 

scala> import collection.JavaConversions._ 
import collection.JavaConversions._ 

scala> foo(java.util.Arrays.asList(1, 2, 3): _*) 
res6: Int = 3 

यह खंड 4.6.2 में Language Reference में उदाहरण के साथ अच्छी तरह से समझाया गया है,।

ध्यान दें कि ये उदाहरण स्कैला 2.8.0.आरसी 2 के साथ किए गए हैं।

+1

संदर्भ http://www.scala-lang.org/docu/files/ScalaReference.pdf पर ले जाया गया है – pocorall