2013-05-01 10 views
10

スカラ(akin to Clojure)の関数の入力パラメータを解体する方法はありますか?Scalaで入力パラメータを破壊することは可能ですか?

ので、代わりに

scala> def f(p: (Int, Int)) = p._1 
f: (p: (Int, Int))Int 

の私は(それが動作しない)、これを持っているしたいと思います:

scala> def f((p1, p2): (Int, Int)) = p1 
+0

リクエストをScalaの問題にトラッカー:https://issues.scala-lang.org/browse/SI-7909 – retronym

答えて

14

を、私はあなたが同じことを達成するためのパターンマッチングを使用するScalaで推測します、例えば

val f: (Int, Int) => Int = { case (p1, p2) => p1 } 

または、同等に:このようなタイプが推測できる場合

def f(p: (Int, Int)) = p match { case(p1, p2) => p1 } 

(Int, Int) => Intをドロップすることができます。同じのため

List((1, 2), (3, 4)) map { case (p1, p2) => p1 } 
+2

私はむしろあまりにも冗長な解決策としてパターンマッチングの使用を避けたいと思います。しかし、他の慣用的なアプローチがなければ、私はそれを受け入れることができます。 1つはありますか? –

+1

私には分かりません... – ValarDohaeris

+2

@JacekLaskowski - これはあなたが得る最高です。タプルとメソッドのパラメータは完全に統一されていないため、これはあなたが気づいた場所の1つです。しかし、 'def'が別々の引数を取ってもタプルを取る関数を作成するには' def f(p1:Int、p2:Int)= p1 + p2'と '(f_)。 –

0
def f(p: ((Int, Int), (Int, Int))) = p._1  > f: (p: ((Int, Int), (Int, Int)))(Int, Int) 
f((1,2), (3,4))        > res1: (Int, Int) = (1,2) 
関連する問題