昨日は型パラメータを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,)