2012-07-23 29 views
44

Trong python tôi có thể làm điều này:Scala: Phân rã các bộ trong đối số chức năng

def f((a, b)): 
    return a + b 

d = (1, 2) 
f(d) 

Ở đây, thông qua trong tuple đang bị phân hủy khi nó được thông qua để f.

Ngay bây giờ trong scala ngay bây giờ tôi đang làm điều này:

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

Có điều gì tôi có thể làm ở đây để phân hủy xảy ra trong khi các đối số được truyền vào? Chỉ tò mò thôi.

Cảm ơn.

+2

Thú vị. Tôi không biết điều này thậm chí có thể bằng Python. – Debilski

+1

Ngoài ra: https://issues.scala-lang.org/browse/SI-813 – Debilski

Trả lời

69

Bạn có thể tạo một hàm và phù hợp với đầu vào của nó với mô hình kết hợp:

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

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

Hoặc phù hợp với đầu vào của phương pháp này với match keyword:

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 

Một cách khác là sử dụng một chức năng với hai đối số và để "tuple" nó:

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

Làm thế nào về:

ab._1 + ab._2 

Các _1, _2, vv truy cập vào các yếu tố khác nhau của tuple.

+0

Vâng, điều này sẽ tương tự như làm 'def f (a): a [0] + a [1]' trong python. Tôi thực sự không cố gắng để tránh bổ sung 'val (a, b) = ab' chuyển nhượng ở đây. – 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))) 

} 

bản in:

(1,3) 1 
(1,3) 1 
(1,3) 1 
Các vấn đề liên quan