概要

Predefに定義された暗黙の型変換に関する記述を見てみる。

「クラスA → クラスB」はクラスAからクラスBに対する暗黙の型変換が指定されているという意味で使っている。

PredefのScaladoc
http://www.scala-lang.org/api/current/scala/Predef$.html

@CretedDate 2011/05/03
@Versions Scala2.8

any2Ensuring

Any → Ensuring

Ensuringniha,assertを呼び出すensuringという関数が定義されている。これのお陰でAny型に対してensuringを後置表現で記述することができる。

// 処理の結果が想定と違っていたら、AssertionError
{ 1 + 2 } ensuring ( _ == 2 )
  //=> java.lang.AssertionError: assertion failed

any2ArrowAssoc

Any → ArrowAssoc

ArrowAssocには「→」や「->」が関数として定義されている。「→」や「->」はTuple2を返す。これのお陰で、どんな型でも矢印で繋ぐとTuple2に変換できる。

"ONE" -> 1
  //=> (java.lang.String, Int) = (ONE,1)

byteWrapper / shortWrapper / intWrapper など

Byte → RichByte / Short → RichShortなど、RichXXXに変換する。Char、Long、Float、Double、Booleanについても定義されている。

RichXXXはscala.runtime配下にいる。RichXXXは、それぞれの型に応じてmin、max、absなど様々な機能を持つ。また、compare関数が定義されているのでソートなどで役立つ。

これのお陰で、ScalaのIntやDoubleはJavaのラッパークラスと比べて便利な機能をいろいろ持つことができている。

尚、次の項にもあるように、ScalaはJavaのラッパークラスに対する暗黙の型変換も行っている。

byte2Byte / short2Short / char2Character など

Byte → java.lang.Byte / Short → java.lang.Shortなど、ScalaのAnyVal配下の型を、対応するJavaのラッパークラスに変換する。

ので、ScalaのAnyValな子たちはJavaのラッパクラスの持つ機能も利用可能になっている。


// java.lang.IntegerのtoBinaryStringを使ってみる
7.toBinaryString
  //=> String = 111

exceptionWrapper

Throwable → scala.runtime.RichException

RichExceptionにはgetStackTraceStringというStackTraceをStringに変換するメソッドが用意されている。

こんな感じで、Messageは付かず、StackTraceの部分だけ改行付きで取得する。

object Test extends Object with Application {
    try { 1 / 0 }
    catch { case e : Exception ⇒ println(e.getStackTraceString) }
}
  //=> sample.Test$.<init>(Test.scala:6)
  //=> sample.Test$.<clinit>(Test.scala)
  //=> sample.Test.main(Test.scala)

genericArrayOps

Array → scala.collection.mutable.ArrayOps

ArrayOpsには、flatten、transposeなどのメソッドが用意されている。

// flattenはListにもある平らにするヤツ
Array(Array(1), Array(2)) flatten
  //=> Array(1, 2)

// transposeは二次元の行列の軸を入れ替える
Array( Array(1, 2, 3), Array(4, 5, 6) ) transpose
  //=> Array[Array[Int]] = Array(Array(1, 4), Array(2, 5), Array(3, 6))

byte2short / short2long / int2double など

Byte → Short、Long → Doubleのように、自身より大きい型へ暗黙の型変換ができるように指定されている。これによって必要に応じて自分より大きい型に自動変換がされるようになる。

変換が定義されているのは、以下。

Byte → Short / Int / Long / Float / Double

Short → Int / Long / Float / Double

Char → Int / Long / Float / Double

Int → Long / Float / Double

Long → Float / Double

Float → Double

Double → なし

そういえばLongからFloatに変換してしまうと、精度落ちるよね。まぁ、Doubleでも落ちるけど。

any2stringadd

Any → scala.runtime.StringAdd

StringAddは以下のような「+」関数を定義している。

def +(other: String) = String.valueOf(self) + other

これでどんな型でも「+」で繋げば、String.valueOfされて文字列として連結できる。

augmentString

String → scala.collection.immutable.StringOps

StringOpsはStringOpsscala.collection.immutable.StringLikeトレイトを継承している。

これによってScalaのStringはjava.lang.Stringにはない様々な機能が利用できる。

// Intに手軽に変換できる(内部的にはInteger.parseInt呼び出し)
"10" toInt
  //=> Int = 10

// * なんかも使える
"abc" * 3
  //=> String = abcabcabc

// linesは改行で分割したiteratorを返す
( "abc\ndef\nghi" lines ) foreach(println)
  //=> abc
  //=> def
  //=> ghi

その他、いろいろ。詳しくはStringOpsのAPI参照。
http://www.scala-lang.org/api/current/scala/collection/immutable/StringOps.html

unaugmentString

scala.collection.immutable.StringOps → String

augmentStringの逆。

seqToCharSequence / arrayToCharSequence

collection.IndexedSeq[Char] → java.lang.CharSequence(を独自実装したクラス)

Array[Char] → java.lang.CharSequence(を独自実装したクラス)

Charの配列やCollectionがCharSequenceっぽく使えるようになる。CharSequenceはjava.lang.Stringやjava.lang.StringBuilderでも実装されているインターフェース。

<%< / <:<

可視境界と上限境界を定義してるように見えるのだけど、今ひとつよく分かってないのでパス。