タプル

昨日は型パラメータを2つとる Pair というクラスを作った。

scala> class Pair[A, B](val a: A, val b: B)
defined class Pair

こういうコンテナ型は、メソッドの返り値に複数の値を返したいようなときに使える(Scala のメソッドは Go と違って1つの値しか返せない)。例えば、割り算の商とあまりを返す divide メソッドはこんなふうだ。

scala> def divide(m: Int, n: Int): Pair[Int, Int] = new Pair(m / n, m % n)
divide: (m: Int, n: Int)Pair[Int,Int]

scala> val x = divide(7, 3)
x: Pair[Int,Int] = Pair@12fd3b16

scala> x.a
res0: Int = 2

scala> x.b
res1: Int = 1

こういうコンテナはよく使うので、Scala には Tuple1 から Tuple22 までのクラス(数字は要素の数)が用意されている。しかも:

scala> new Tuple2(3, 1)
res2: (Int, Int) = (3,1)

と書かずに

scala> (3, 1)
res3: (Int, Int) = (3,1)

と書くことができる。この書き方によれば、上のメソッドは次のように簡潔に書ける。

scala> def divide2(m: Int, n: Int): (Int, Int) = (m / n, m % n)
divide2: (m: Int, n: Int)(Int, Int)

scala> divide2(7, 3)
res4: (Int, Int) = (2,1)

ところで、Tuple1 ってのは要素数1のタプルだろう。これって存在意義あんの?簡略な記法じゃ作れないし。

scala> (1)
res5: Int = 1

scala> (1,)
<console>:1: error: illegal start of simple expression
       (1,)
          ^
scala> new Tuple1(1)
res6: (Int,) = (1,)