ぜったいってなに

Software Engineerのブログです。

Scalaのpimp my libraryを試す

参考文献

Implicit · Scala研修テキスト


pimp my libraryとは

  • ScalaのImplicit conversion (暗黙の型変換) の機能の中のひとつ
  • 既存のクラスにメソッドを追加して簡単に拡張できる
  • 例えばこんな具合
implicit class RichString(val src: String) {
  def smile: String = src + ":-)"
  def wink: String = src + ";)"
}

やってみる

sbtコンソール上でメソッドを定義して試す。

scala> implicit class RichString(val src: String) {
     |   def smile: String = src + ":-)"
     |   def wink: String = src + ";)"
     | }
defined class RichString

scala> "Hello! ".smile
res0: String = Hello! :-)

scala> "".wink
res1: String = ;)

所感

良さそうなところ
  • めんどくさいこと考えずに既存クラスに機能追加できる
良くなさそうなところ
  • 使い方によってはコードの保守性が低くなりそう
  • 例えばこんなこともできちゃう
implicit class Bug(val src: String) {
  def one: Int = 1
}

実行するとこんなかんじ。

scala> implicit class Bug(val src: String) {
     |   def one: Int = 1
     | }
defined class Bug

scala> "hogehoge".one
res2: Int = 1

scala> "two".one
res3: Int = 1

Stringのメソッドを叩いたらInt型が返ってきちゃう。


今後のこと

DwangoさんのScala研修テキストや本でScala学習をしてきたけど、そろそろなんか作ってみたい。ものを作っていて引っかかったところは調べるってやり方だと体系的に学びにくいので、「説明書を読んでからやる」っていうやり方は必要だと思いつつ、やっぱり退屈ではある。