2016年1月13日

日記

GDK (Groovy GDK) で File, Path に追加されているメソッド traverse()。 3つのメソッドオーバーロードされてるけど、一番一般性のあるのは

void travese(Map option, Closure closure)

という定義。 指定できる走査オプションには ファイルの種類(ファイル/ディレクトリ/全て)を指定する type (FileType 型)や、ルートディレクトリを走査するかどうかを指定する visitRoot (Boolean 値)など、いろいろ指定可。 

さて、同様のメソッドScala で定義するにはどうするのがいいか。 引数に Map を使ってもいいんだけど、どうせ Scala でやるならキチンと静的に型チェックできるような定義にしたい所。 まぁ普通にやるなら

def traverse(fileType: FileType = FileType.ANY,
             visitRoot: Boolean = false,
             ...(その他のオプション))
             (consumer: File => FileVisitResult): Unit

みたいな感じかな? 使うときは

file.traverse(visitRoot = true){ f  =>
  println(f)
  FileVisitResult.CONTINUE
}

という風にする。 まぁ、これで問題ないのだけど、ちょこっと不満なのはオプションを指定しないときに

file.traverse(){ f =>
  println(f)
  FileVisitResult.CONTINUE
}

のように不必要な () を付けないといけないところ。 この () を付けなくていいようにするためには

def traverse(consumer: File => FileVisitResult): Unit

というシグニチャの travese() メソッドオーバーロードしたいところなんだけど、引数にデフォルト値を指定している場合はこのオーバーロードが定義できない(Scala 2.11.7)。 まぁ、これは仕方なさそう。 ってことで最初のメソッド定義を変更して、走査オプションを TraverseOption クラスとして別に定義してみる... 続きは明日。

NHK 世界のニュース ザッピング(翌日)

  • 【英 BBC】 3,000年前の遺跡発見
  • 【上海 東方衛視】 古代の豪華馬車10年かけ復元
  • ベトナム VTV】 ゴミを観光資源に
  • 【独 ZDF】 女優ルート・ロイベリク91歳で死去
  • 【タイ CH9】 きょうから観光フェスティバル
  • 【米 ABC】 オバマ大統領最後の一般教書演説

ツイート (ツイート数 29)