Example8.5

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

8.5 タプル (Tuples)

関数から1つ以上の結果を返す必要がたまに生じます。たとえば、与えられた2つの整数引数の整数商と余りを返す関数 divmod を考えましょう。もちろん、divmod の2つの結果を保持するクラスを次のようにも定義できます。

case class TwoInts(first: Int, second: Int) 
def divmod(x: Int, y: Int): TwoInts = new TwoInts(x / y, x % y)

しかし、結果型のペア一つ一つに対し、新しいクラスを定義しなくてはならないのでは、あまりに面倒です。Scala ではその代わりに、次のように定義されたジェネリッククラス Tuple2 を使えます。

package scala 
case class Tuple2[A, B](_1: A, _2: B) 

Tuple2 を用いて divmod メソッドは次のように書けます。

def divmod(x: Int, y: Int) = new Tuple2[Int, Int](x / y, x % y) 

コンストラクタへの型パラメータは、値引数から推論可能な場合、通常省略できます。異なる要素数ごとにタプルクラスが存在します (現在の Scala 実装では、要素数をある適正値に制限しています) 。

タプルの要素にどうやってアクセスするのでしょうか? タプルはケースクラスなので、2つの可能性があります。次の例のように、タプルのフィールドにコンストラクタパラメータ名 _i を用いてアクセスできます。

val xy = divmod(x, y) 
println("quotient: " + xy._1 + ", rest: " + xy._2) 

あるいは次の例のように、タプルに対するパターンマッチを用います。

divmod(x, y) match { 
  case Tuple2(n, d) => 
    println("quotient: " + n + ", rest: " + d) 
} 

型パラメータはパターンでは決して使われないことに注意して下さい。「case Tuple2[Int, Int](n, d)」と書くのは文法違反です。(訳注 : たとえば、「case x:Tuple2[Int,Int] =>・・・」と書くのは OK です)

タプルは非常に便利なので、Scala では特別な構文が用意されています。n 要素 x1,...,xn のタプルは、(x1,...,xn) と書けます。これは Tuplen(x1,...,xn) と等価です。(...) 構文は、型やパターンについても同じように働きます。タプル構文を使って、divmod の例は次のように書けます。

def divmod(x: Int, y: Int): (Int, Int) = (x / y, x % y)
divmod(x, y) match { 
  case (n, d) => println("quotient: " + n + ", rest: " + d) 
} 

名前:
コメント:
最終更新:2011年02月24日 08:44
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。