S-JIS[2010-10-23/2011-07-24] 変更履歴
タプルとは、データベースやファイルでいう1行・1レコードのデータのようなもの。つまり複数のデータを1つの塊として扱える。
タプルを使って、メソッド・関数から複数の値を一度に返すことが出来るので、非常に便利。
|
値をカンマ区切りで並べて丸括弧でくくるとタプルになる。(→その他の方法)
val t = (1, "abc", 2)
また、タプルの代入先の変数も個々に定義して丸括弧で囲むと、それぞれの変数に代入してくれる。
※「パターンマッチング機能」というらしい
val (n, s, m) = t // nに1、sに"abc"、mに2が入る
タプルから個々の要素を取り出す事も出来る。
val n = t._1 val s = t._2 val m = t._3
が、順序に依存するので、あまり使わない方がいいような気がする。
なお、タプルの個々の要素は変更不可。(なので、t._1
等に代入することは出来ない)
タプルの型は、タプルの要素の型をカンマ区切りで並べて、全体を括弧で囲んで表す。[2011-07-24]
(要素の型, …)
例えば「("abc", 123)
」というタプルの型は「(String, Int)
」となる。
また、タプルは要素数に応じてTuple1, Tuple2, …というクラスがあるので、「Tuple2[String,
Int]
」の様に表すことも出来る。
タプルを使って複数の値を返す例。
戻り値の型を型推論に任せる | 戻り値の型を明示する |
---|---|
def sample(a: Int, b: Int) = { val sum = a + b val sub = a - b (sum, sub) } |
def sample(a: Int, b: Int): (Int, Int) = { val sum = a + b val sub = a - b return (sum, sub) } |
val (p, m) = sample(11, 22) // pに33、mに-11が入る
val r = sample(11, 22) val p = r._1 // 33が入る val m = r._2 // -11が入る
タプルは複数の要素を返すので、要素数が2個以上でないと意味が無いと思う。[2010-11-28]
しかし要素数が0個(要素を指定しない)、1個だとどうなるか?
要素数 | 例 | 備考 |
---|---|---|
0 |
scala> () scala> val v = () v: Unit = () |
要素が無いタプルは、Unitクラスの唯一の値として使われている。 |
scala> Tuple0()
<console>:6: error: not found: value Tuple0
Tuple0()
^
|
しかしTuple0というクラスが用意されている訳では無い。 | |
scala> Tuple() res0: (Unit,) = (()) |
Tupleクラスに引数を指定しないと、要素数が1個で値が「()」であるタプルになった。 | |
1 |
scala> (1) res1: Int = 1 |
タプルではなくて、単なる小括弧による優先順位の高い演算扱い。 つまり「 (2 - 1) 」とかと同じ。 |
scala> Tuple1(1) res1: (Int,) = (1) scala> Tuple(1) res1: (Int,) = (1) |
しかしTuple1というクラスは用意されているので、明示的に指定すれば使える。 | |
2 |
scala> (1,2) res2: (Int, Int) = (1,2) scala> Tuple2(1,2) res2: (Int, Int) = (1,2) scala> Tuple(1,2) res2: (Int, Int) = (1,2) scala> Pair(1,2) res2: (Int, Int) = (1,2) scala> 1 -> 2 res2: (Int, Int) = (1,2) |
要素数が2個の場合は「Pair」という特別なクラス(オブジェクト)と「->」という書き方がある。[2010-12-29] |
3 |
scala> (1,2,3) res3: (Int, Int, Int) = (1,2,3) scala> Tuple3(1,2,3) res3: (Int, Int, Int) = (1,2,3) scala> Triple(1,2,3) res3: (Int, Int, Int) = (1,2,3) |
要素数が3個の場合は「Triple」という特別なクラス(オブジェクト)がある。[2010-12-29] |
22 |
scala> (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1) res22: (Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int, Int , Int, Int, Int, Int, Int, Int, Int, Int, Int, Int) = (1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1) |
|
23 |
scala> (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)
<console>:6: error: value Tuple23 is not a member of package scala
(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)
^
|
どうやら要素数23個以上のタプルは駄目らしい。(Scala2.8.0) |