2009-06-17 21 views
54

से उपयोग करना varargs मैं निम्न कार्य पूरे करने पता लगाने की कोशिश बाहर मेरे बाल फाड़ कर रहा हूँ:स्काला

def foo(msf: String, o: Any, os: Any*) = { 
    println(String.format(msf, o :: List(os:_*))) 
} 

एक कारण है कि मैं एक o और एक osSeq अलग से प्रणाली की घोषणा करने के लिए है नहीं है। असल में, मैं एक ऑब्जेक्ट पैरामीटर के साथ प्रारूप प्रारूप के साथ समाप्त होता हूं (प्रकार List)। प्रयास कर रहा है:

found: Array[Any]

required Seq[java.lang.Object]

मैं कोशिश की है कास्टिंग, जो संकलित लेकिन पहले उदाहरण के रूप में काफी इसी कारण विफल रहता है:

def foo(msf: String, o: Any, os: Any*) = { 
    println(String.format(msf, (o :: List(os:_*))).toArray) 
} 

मुझे प्रकार की त्रुटि देता है। जब मैं

println(String.format(msg, (o :: List(os:_*)) :_*)) 

कोशिश यह अंतर्निहित रूपांतरण अस्पष्टता (any2ArrowAssoc और any2stringadd)

उत्तर

65
def foo(msf: String, o: AnyRef, os: AnyRef*) = 
    println(String.format(msf, (o :: os.toList).toArray : _*)) 
+0

यह कम्पाइल लेकिन रनटाइम पर अधिक पड़ता है: सूत्र में अपवाद "मुख्य" java.lang.ClassCastException:। स्केला $ बृहदान्त्र $ बृहदान्त्र \t scala.runtime.RichString पर scala.runtime.BoxedObjectArray में ढाला नहीं जा सकता .format (RichString.scala: 242) –

+0

इसके अलावा, कहां से आती है? –

+0

फिक्स्ड, यह अब काम करता है। मैं एक बग रिपोर्ट दर्ज कर रहा हूं - स्केल को क्लासकास्ट अपवाद नहीं होना चाहिए, सिवाय इसके कि आपने इंस्टेंसऑफ के रूप में उपयोग किया है। toList Iterable पर एक विधि [एक] –

12
def foo(msf: String, o: AnyRef, os: AnyRef*) = 
    println(String.format(msf, o :: os.toList : _*)) 

या

def foo(msf: String, o: AnyRef, os: AnyRef*) = 
     println(msf format (o :: os.toList : _*)) 

मैं बहुत बाद पसंद करते हैं के साथ संकलित करने के लिए विफल रहता है, हालांकि यह है कोई लोकेल * समर्थन नहीं।

  • स्कैला 2.8 में रिचस्ट्रिंग के प्रारूप के साथ लोकेल समर्थन है।
+0

रिचस्ट्रिंग प्रारूप विधि का उपयोग करना मैंने अंत में चुना है –