Scala Language
タプル
サーチ…
備考
タプルの長さを23に制限するのはなぜですか?
タプルは、コンパイラによってオブジェクトとして書き換えられます。コンパイラはTuple1
からTuple22
アクセスできます。この任意の制限は、言語設計者によって決定されました。
なぜタプルの長さは0から数えるのですか?
Tuple0
はUnit
相当します。
新しいタプルを作成する
タプルは、2から22の値の異種コレクションです。タプルは、かっこで定義できます。サイズ2
タプル(「ペア」とも呼ばれます)には、矢印の構文があります。
scala> val x = (1, "hello") x: (Int, String) = (1,hello) scala> val y = 2 -> "world" y: (Int, String) = (2,world) scala> val z = 3 → "foo" //example of using U+2192 RIGHTWARD ARROW z: (Int, String) = (3,foo)
x
はサイズ2のタプルです。タプルの要素にアクセスするには、 ._1
、 ._22
使用します。たとえば、 x._1
を使用してx
タプルの最初の要素にアクセスできます。 x._2
は2番目の要素にアクセスします。もっとエレガントに、 タプル抽出子を使うことができます 。
サイズ2のタプルを作成するための矢印の構文は、主に(key -> value)
ペアであるMapで使用され(key -> value)
。
scala> val m = Map[Int, String](2 -> "world") m: scala.collection.immutable.Map[Int,String] = Map(2 -> world) scala> m + x res0: scala.collection.immutable.Map[Int,String] = Map(2 -> world, 1 -> hello) scala> (m + x).toList res1: List[(Int, String)] = List((2,world), (1,hello))
マップ内のペアの構文は矢印の構文で、1がキーで、aがそのキーに関連付けられた値であることがわかります。
コレクション内のタプル
タプルはコレクション内でよく使用されますが、特定の方法で処理する必要があります。たとえば、次のタプルのリストがあるとします。
scala> val l = List(1 -> 2, 2 -> 3, 3 -> 4)
l: List[(Int, Int)] = List((1,2), (2,3), (3,4))
暗黙的なタプル・アンパックを使用して要素を一緒に追加するのは自然なようです。
scala> l.map((e1: Int, e2: Int) => e1 + e2)
ただし、この結果、次のエラーが発生します。
<console>:9: error: type mismatch;
found : (Int, Int) => Int
required: ((Int, Int)) => ?
l.map((e1: Int, e2: Int) => e1 + e2)
スカラは、この方法でタプルを暗黙的にアンパックすることはできません。この地図を修正するには2つの方法があります。最初に、位置アクセサ_1
と_2
を使用します。
scala> l.map(e => e._1 + e._2)
res1: List[Int] = List(3, 5, 7)
もう1つのオプションは、 case
文を使用してパターンマッチングを使用してタプルをアンパックすることです。
scala> l.map{ case (e1: Int, e2: Int) => e1 + e2}
res2: List[Int] = List(3, 5, 7)
これらの制限は、タプルのコレクションに適用される上位関数に適用されます。