2012-07-23 15 views
44

अजगर में मैं यह कर सकता हूँ में tuples सड़ते हुए।स्काला:</p> <pre class="lang-py prettyprint-override"><code>def f((a, b)): return a + b d = (1, 2) f(d) </code></pre> <p>यहाँ टपल में पारित कर दिया, जबकि इसकी <code>f</code> को पारित किया जा रहा विघटित किया जा रहा है: समारोह तर्क

अभी अभी स्केला में मैं यह कर रहा हूं:

def f(ab:(Int, Int)) : Int = { 
    val (a, b) = ab 
    a + b 
} 
val d = (1, 2) 
f(d) 

वहाँ कुछ मैं यहाँ क्या कर सकते हैं ताकि अपघटन होता है, जबकि बहस में पारित कर रहे हैं है? बस उत्सुक।

धन्यवाद।

+2

दिलचस्प। मुझे नहीं पता था कि यह पायथन में भी संभव था। – Debilski

+1

इसके अलावा: https://issues.scala-lang.org/browse/SI-813 – Debilski

उत्तर

69

आप एक समारोह बना सकते हैं और पैटर्न मिलान के साथ अपने इनपुट से मेल कर सकते हैं:

scala> val f: ((Int, Int)) => Int = { case (a,b) => a+b } 
f: ((Int, Int)) => Int 

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

या match कीवर्ड के साथ विधि के इनपुट से मेल खाते हैं:

scala> def f(ab: (Int, Int)): Int = ab match { case (a,b) => a+b } 
f: (ab: (Int, Int))Int 

scala> f(1, 2) 
res1: Int = 3 

एक और तरीका है एक समारोह का उपयोग करने के लिए है दो तर्कों के साथ और इसे "tuple" करने के लिए:

scala> val f: (Int, Int) => Int = _+_ 
f: (Int, Int) => Int = <function2> 

scala> val g = f.tupled // or Function.tupled(f) 
g: ((Int, Int)) => Int = <function1> 

scala> g(1, 2) 
res10: Int = 3 

// or with a method 
scala> def f(a: Int, b: Int): Int = a+b 
f: (a: Int, b: Int)Int 

scala> val g = (f _).tupled // or Function.tupled(f _) 
g: ((Int, Int)) => Int = <function1> 

scala> g(1, 2) 
res11: Int = 3 

// or inlined 
scala> val f: ((Int,Int)) => Int = Function.tupled(_+_) 
f: ((Int, Int)) => Int = <function1> 

scala> f(1, 2) 
res12: Int = 3 
1

कैसे के बारे में:

ab._1 + ab._2 

_1, _2 आदि टपल के विभिन्न तत्वों का उपयोग।

+0

ठीक है, यह 'def f (ए): एक [0] + एक [1] 'पायथन में करने के समान होगा। मैं वास्तव में उस अतिरिक्त 'वैल (ए, बी) = एबी 'असाइनमेंट से बचने की कोशिश नहीं कर रहा हूं। – verma

1
object RandomExperiments extends App{ 
    def takeTuple(t:(Int,Int))=print (s"$t ${t._1}\n") 
    takeTuple(1,3) 
    takeTuple((1,3)) 
    takeTuple(((1,3))) 

} 

प्रिंट:

(1,3) 1 
(1,3) 1 
(1,3) 1 
संबंधित मुद्दे

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