2011-06-12 5 views
9

के रूप में एक tuple का उपयोग कर एक विधि को आमंत्रित करें मुझे आश्चर्य है कि ऐसा करने का सबसे अच्छा तरीका क्या है।पैरामीटर सूची

val foo = Some("a") 
val bar = Some(2) 

def baz(a: String, b: Int) = if((b % 2) == 0) Some(a+","+b) else None 

(x zip y) flatMap baz //does not compile of course 
(x zip y) flatMap { x => baz(x._1, x._2) } //ugly 

मुझे लगता है कि ओडर्सकी एट अल। इस उदाहरण में शोर को कम करने के लिए उनकी आस्तीन एक और चाल है।

तो प्रश्न यह है कि आपको अव्यवस्था से लड़ने का तरीका यह माना जाता है कि आपको baz (उदा। def baz(a: (String Int))) के कार्यान्वयन को बदलने की अनुमति नहीं है।

+0

+1 मुझे पता है कि यह एक डुप्लिकेट है, लेकिन शीर्षक यह है कि यह शीर्षक बेहतर होगा अधिक लोगों द्वारा पाया जा सकता है :) – fresskoma

उत्तर

17

यह सवाल पहले से ही यहाँ उत्तर दिया गया है: scala tuple unpacking

पहले, आंशिक आवेदन के द्वारा एक समारोह के लिए foo बनाएं, फिर अपने पैरामीटर सूची के साथ tupled फोन:

(foo _).tupled(myTuple) 
+1

धन्यवाद! (एक्स ज़िप वाई) flatMap (baz _)। एक आकर्षण की तरह tupled काम करता है। –

1

सबसे आम तरीका सफाई से अनपैक करने के लिए पैटर्न या समझ के साथ कुछ भी है:

for ((a,b) <- (x zip y); c <- baz(a,b)) yield(c) 
संबंधित मुद्दे