2016年1月16日

日記

Java の nio の Files#walkFileTree() メソッドとか GDK (Groovy JDK) の traverse() メソッドって、処理の最後に FileVisitResult のオブジェクト(定数)を返す必要があるけど、これ結構めんどくさい。 でも Scala の暗黙の型変換を使えば(GDK では使えないけど)、この面倒さを回避できる。 もう少し詳しくいうと、CONTINUE を返す場合は省略できると言った方がいいかな。 まず、次のようなユーティリティ・クラスを定義する:

trait FileVisitUtil{
  implicit def convertAnyToFileVisitResult(any: Any): FileVisitResult =
    FileVisitResult.CONTINUE
}

object FileVisitUtil extends FileVisitUtil

まぁ、全てのオブジェクトを暗黙的に FileVisitResult.COTNINUE に変えてるだけ。 さて、これを使うと、FileVisitResult オブジェクトを返すべきメソッドクロージャにて return FileVisitResult.CONTINUE という文を省略できる:

import FileVisitUtil._

class FileVisitorImpl extends java.nio.file.SimpleFileVisitor[Path]{

  override def visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult =
    println(file)
}

この場合、println() メソッドが返す Unit オブジェクトを暗黙的に FileVisitResult.CONTINUE オブジェクトに変換してる。 上記のように処理が1行で済むなら無駄な中括弧 {} も省略できて楽ちん感増幅。 もちろん、CONTINUE 以外の FileVisitResult オブジェクトを返したいなら普通に書く必要があるけど、逆に言えば普通に書けばいいだけ。 FileVisitResult オブジェクトを返すなら暗黙の型変換が適用されないからね。

Scalaスケーラブルプログラミング第2版

Scalaスケーラブルプログラミング第2版

ツイート (ツイート数 34)