S-JIS[2010-10-23/2011-07-24] 変更履歴

Scalaタプル

タプルとは、データベースやファイルでいう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)

Scala目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま