スカラ(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
スカラ(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
を、私はあなたが同じことを達成するためのパターンマッチングを使用する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 }
私はむしろあまりにも冗長な解決策としてパターンマッチングの使用を避けたいと思います。しかし、他の慣用的なアプローチがなければ、私はそれを受け入れることができます。 1つはありますか? –
私には分かりません... – ValarDohaeris
@JacekLaskowski - これはあなたが得る最高です。タプルとメソッドのパラメータは完全に統一されていないため、これはあなたが気づいた場所の1つです。しかし、 'def'が別々の引数を取ってもタプルを取る関数を作成するには' def f(p1:Int、p2:Int)= p1 + p2'と '(f_)。 –
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)
リクエストをScalaの問題にトラッカー:https://issues.scala-lang.org/browse/SI-7909 – retronym