2011-04-13 11 views
14

दिया जैसे:क्या स्काला स्प्लिट किसी भी चीज के लिए इस्तेमाल किया जा सकता है जो एक varargs नहीं है?

scala> def pipes(strings:String*) = strings.toList.mkString("|") 

जो मैं आमतौर पर कॉल कर सकते हैं:

scala> pipes("foo", "bar") 
res1: String = foo|bar 

या एक सूचक के साथ:

scala> val args = List("a","b","c") 
scala> pipes(args:_*) 
res2: String = a|b|c 

लेकिन मैं एक सूचक का उपयोग कुछ भी लेकिन एक के लिए तर्क प्रदान करने के लिए कर सकते हैं varargs पैरामीटर? उदाहरण के लिए: मैं की तरह कुछ करना चाहते हैं:

scala> def pipeItAfterIncrementing(i:Int, s:String) = (i + 1) + "|" + s 
scala> val args:Tuple2[Int, String] = (1, "two") 
scala> pipeItAfterIncrementing(args:_*) 

कि काम नहीं करता है, लेकिन वहाँ किसी भी तरह से एक वस्तु से कई तर्क प्रदान करने, चाहे वह एक टपल या कुछ और हो सकता है की एक ही प्रभाव को प्राप्त करने के लिए है? क्या कोई कारण है कि इसे टुपल्स के लिए लागू नहीं किया जा सका, यह देखते हुए कि उनकी लंबाई और प्रकार दोनों संकलन-समय पर ज्ञात हैं?

उत्तर

21

आप वास्तव में यह करने के लिए Function.tupled उपयोग कर सकते हैं: एक समारोह है कि एक समारोह है कि arity n की एक एकल टपल तर्क लेता में n तर्क लेता है बदल जाते हैं। जैसा कि उम्मीद की जा सकती है, Function.untupled रिवर्स जॉब करता है।

विशेष प्रकार के लिप्यंतरण : _* केवल दोहराए गए पैरामीटर (ए.के.ए. varargs) के लिए लागू है।

scala> def pipeItAfterIncrementing(i:Int, s:String) = (i + 1) + "|" + s 
pipeItAfterIncrementing: (i: Int,s: String)java.lang.String 

scala> def tupledPipeItAfterIncrementing = Function.tupled(pipeItAfterIncrementing _) 
tupledPipeItAfterIncrementing: ((Int, String)) => java.lang.String 

scala> val args:Tuple2[Int, String] = (1, "two") 
args: (Int, String) = (1,two) 

scala> tupledPipeItAfterIncrementing(args) 
res0: java.lang.String = 2|two 
12

खैर तरह का ...

scala> def pipeItAfterIncrementing(i:Int, s:String) = (i + 1) + "|" + s 
scala> val args:Tuple2[Int, String] = (1, "two") 
scala> (pipeItAfterIncrementing _).tupled(args) 

आप इच्छित 2|two दे देंगे।

+0

अच्छा जवाब, मुझे डर है कि जेपीपी ने आपको इसे हरा दिया है;) – gfxmonk

+0

आपको कई उत्तरों को ऊपर उठाने की अनुमति है (और प्रोत्साहित)। बस 'स्वीकार करना' एक जवाब में कम हो गया है। –

+0

प्लस, आपका उत्तर यह भी दिखाता है कि 'tupled' 'फंक्शन' ऑब्जेक्ट पर एक के अलावा 'फंक्शन' उदाहरणों पर भी एक विधि है। –

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

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