67

Pythonではこれを行うことができます:

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

d = (1, 2)
f(d)

ここで、渡されたタプルは、に渡される間に分解されfます。

今、scalaで私はこれをやっています:

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

val d = (1, 2)
f(d)

引数が渡されている間に分解が行われるように、ここでできることはありますか?ちょっと興味があるんだけど。

4

3 に答える 3

95

関数を作成し、その入力をパターンマッチングと一致させることができます。

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

もう1つの方法は、2つの引数を持つ関数を使用し、それを「タプル」することです。

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
于 2012-07-23T15:34:48.403 に答える
6

からScala 3、改善されたtupled function機能で:

// val tuple = (1, 2)
// def f(a: Int, b: Int): Int = a + b
f.tupled(tuple)
// 3

Scastieで遊んでください

于 2020-06-01T13:04:05.050 に答える
0
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
于 2017-04-01T16:22:35.940 に答える