超有能オブジェクトPredefの知られざる機能を明らかにします

Scala 3 (Dotty 0.26.0-RC1) 2.13.3 2.12.12
最終更新:2020年7月6日

[AD] scalapediaでは記事作成ボランティアを募集しています

scala.Predefというオブジェクトを知っていますか?知らない人も多いと思います。
でも、実はScalaを使っている人でPredefオブジェクトを使ったことのない人はいないんです。いったいなぜでしょうか。
そういえばprintlnってなんでどこからでも使えるんでしょうかね??
この記事では、そんなScalaの縁の下の力持ちであるPredefオブジェクトについてご紹介します。

Scala Standard Library:Predef

PredefオブジェクトはScalaプログラムのどこからでも使える

Predefオブジェクトは、Scalaの標準ライブラリの中では極めて特殊なオブジェクトです。

というのも、Predefオブジェクトに定義されたメソッドや変数やクラスは、どんなScalaプログラムからでもアクセス可能になっています。

これによって、使いたいクラスやメソッドをわざわざ明示的にインポートするという手間なく、どこでも自由に使うことができるのです。

コンソール出力をするprintln/print

標準出力への出力を簡単にするため、Predefオブジェクトにはprintprintlnという便利なメソッドが宣言されています。

def print def println def printf

printlnは"Hello! World"をするのに必須ですね。皆さんおなじみです。

println("Hello! World")
Hello! World

これはscala.Consoleに実装されている同名のメソッドのエイリアスとなっています。

printprintlnメソッドについてはこちらの記事で詳しく解説しています。

また、この記事を読んでいる方には今更だとは思いますが、よければこの記事も参考にしてください。

よく使われる型

普段Scalaを書くとき、コレクションを扱うことが多いですよね。
MapSetなどのコレクションを使いますよね。
これらのクラスをインポートしていないのに使っていませんか?

なぜインポートせずに使えるのかというと、Predefにこうした型へのエイリアスが定義されているからです。

Scala Standard Library:scala.collection.immutable.Map
Scala Standard Library:scala.collection.immutable.Set

暗黙の型変換

Scalaを便利に使用するための暗黙の型変換が定義されています。

暗黙の型変換についてはこちらの記事にて詳しく説明しています。

Stringの変換

StringStringOpsWrappedStringに変換するメソッドが定義されています。

implicit def augmentString(x: String): StringOps implicit def wrapString(s: String): WrappedString
Scala Standard Library:scala.collection.StringOps

JavaとScalaとの相互変換

Javaのプリミティブラッパー型からScalaのAnyVal系のクラスへと変換するメソッドが用意されています。

implicit def Boolean2boolean implicit def Byte2byte implicit def Character2char implicit def Double2double implicit def Float2float implicit def Integer2int implicit def Long2long implicit def Short2short

逆に、ScalaのAnyVal系のクラスをJavaのプリミティブラッパー型へと変換するメソッドが定義されています。

implicit def boolean2Boolean implicit def byte2Byte implicit def char2Character implicit def double2Double implicit def float2Float implicit def int2Integer implicit def long2Long implicit def short2Short

RichAnyVal

AnyVal系の各クラスをRich***系のクラスへ暗黙的に変換するメソッドが定義されています。

implicit def booleanWrapper implicit def byteWrapper implicit def charWrapper implicit def doubleWrapper implicit def floatWrapper implicit def intWrapper implicit def longWrapper implicit def shortWrapper

Rich***系のクラスのScaladocはこちらです(2.12であることに注意)。

Scala Standard Library 2.12.12:scala.runtime.RichBoolean
Scala Standard Library 2.12.12:scala.runtime.RichByte
Scala Standard Library 2.12.12:scala.runtime.RichChar
Scala Standard Library 2.12.12:scala.runtime.RichDouble
Scala Standard Library 2.12.12:scala.runtime.RichFloat
Scala Standard Library 2.12.12:scala.runtime.RichInt
Scala Standard Library 2.12.12:scala.runtime.RichLong
Scala Standard Library 2.12.12:scala.runtime.RichShort

2.13では、Rich***系のクラスはscaladocには出力されなくなりました。
ただし、今後のバージョンでは再度出力されるようになる見込みです。

ArrayをArraySeqに変換する

Array[T]ArraySeq[T]に変換するメソッドが定義されています。

implicit def genericWrapArray implicit def wrapUnitArray implicit def wrapBooleanArray implicit def wrapByteArray implicit def wrapCharArray implicit def wrapDoubleArray implicit def wrapFloatArray implicit def wrapIntArray implicit def wrapLongArray implicit def wrapRefArray implicit def wrapShortArray
Scala Standard Library:scala.collection.mutable.ArraySeq

ArrayをArrayOpsに変換する

Array[T]ArrayOps[T]に変換するメソッドが定義されています。

implicit def genericArrayOps implicit def unitArrayOps implicit def booleanArrayOps implicit def byteArrayOps implicit def charArrayOps implicit def doubleArrayOps implicit def floatArrayOps implicit def intArrayOps implicit def longArrayOps implicit def refArrayOps implicit def shortArrayOps
Scala Standard Library:scala.collection.ArrayOps

CharSequence Conversions

Seq[Char]Array[Char]CharSequenceに変換するメソッドが定義されています。

implicit final class SeqCharSequence implicit final class ArrayCharSequence
Java 11 API Docs:java.lang.CharSequence

サイト内検索