Scala ひと巡り : ビュー (Views)

原ページ

暗黙のパラメータ [63]とメソッドは、ビューと呼ばれる暗黙の型変換も定義できます。型 S から型 T へのビューは、関数型 S => T を持つ暗黙の値によって、あるいは、その型の値に変換可能なメソッドによって定義されます。

ビューは 2 つの状況で適用されます:

    • 式 e が型 T で、T が式の要請型(期待される型) pt に適合しないとき

    • 型 T の e の選択 e.m 中で、セレクタ m が T のメンバーを意味しないとき

最初の場合は、 e に適用可能でその結果型が pt に適合するビュー v が検索されます。2 番目の場合は、e に適用可能でその結果型が m という名前のメンバーを含むビュー v が検索されます。

型 List[Int]の 2 つのリスト xs と ys 上の、次の操作は正しいです。

xs <= ys

ただし、下記で定義された 暗黙のメソッド list2ordered と int2ordered がスコープ中にあると仮定して:

implicit def list2ordered[A](x: List[A]) (implicit elem2ordered: a => Ordered[A]): Ordered[List[A]] = new Ordered[List[A]] { /* .. */ } implicit def int2ordered(x: Int): Ordered[Int] = new Ordered[Int] { /* .. */ }

list2ordered 関数は、型パラメータの可視境界(view bound:ビュー境界)を使っても表現できます:

implicit def list2ordered[A <% Ordered[A]](x: List[A]): Ordered[List[A]] = ...

Scala コンパイラはこのとき、上記で与えられた list2ordered の定義に等価なコードを生成します。

暗黙のうちにインポートされる [64] オブジェクト scala.Predef は、いくつかの事前定義された型(たとえば Pair)とメソッド(たとえば error)ばかりでなく、いくつかのビューも宣言します。次の例は、事前定義されたビュー charWrapper のアイデアを示します:

final class RichChar(c: Char) { def isDigit: Boolean = Character.isDigit(c) // isLetter, isWhitespace, etc. } object RichCharTest { implicit def charWrapper(c: char) = new RichChar(c) def main(args: Array[String]) { println('0'.isDigit) } }