概要
以前にScalaのimplicit(暗黙)に関する理解のためのメモでimplicitの使い方について、まとめました。今回は「implicitly」について取り上げます。
implicitlyについて
implicitlyについてはあまり情報がないのですが、stackoverflowのWhat is the Scala identifier “implicitly”?が分かりやすいかなと思います。
要するに暗黙の変数として定義されたものを、型で指定して取得する関数になります。とはいっても、これだけだと何が嬉しいかよくわからないと思うので、下記に例題を用意しました。
例題
下記のように親子関係となっているオブジェクトクラスがあります。ImplicityTestから親クラスにある暗黙の変数(test)の値を取得するためには、どうしたら良いでしょうか。
object ImplicityTest extends ParentImplicityTest{}
abstract class ParentImplicityTest {
implicit val test:String = "implicitTest"
}
取得方法
① 変数名をそのまま使う
変数名が分かっていればそのまま取得すれば良いのですが、ソースを追って変数名を調べなければいけません。
println(test)
② 暗黙の引数を使う
関数で暗黙の引数をString型にすれば、取得可能です。ただ、変数として使いたいだけの場合は、わざわざ関数を作らなければいけないのかと少し感じるかもしれません。
def printlnImplicity(implicit param:String):Unit = {
println(param)
}
③ implicitlyを使う
最後にimplicitlyを使う方法です。implicitlyは型さえ指定すれば、暗黙の変数を変数として取得できます。
println(implicitly[String])