2016年1月14日

日記

昨日
2016年1月13日 - 倭マンのつぶや記
の続き。 いろいろなオプションを指定できるメソッドで全てのオプションを省略する場合に括弧 () を省略できるようにするために、オプション用の別クラス TraverseOption を定義する。 だいたいこんなの

class TraverseOption private (val fileType: FileType, val visitRoot: Boolean)

object TraverseOption{
  def apply(fileType: FileType=FileType.ANY, visitRoot: Boolean=false, ...《他のオプション》): TraverseOption =
    new TraverseOption(fileType, visitRoot, ...)
}

これを使って、traverse() メソッドを実行するには

file.traverse(TraverseOption(fileType=FileType.DIRECTORIES, visitRoot=true)){ f =>
  println(f)
  FileVisitResult.CONTINUE
}

ちょっと TraverseOption と書くのが面倒だけど。 また、traverse() メソッドの定義を

def traverse(consumer: F => FileVisitResult)
def traverse(options: TraverseOption)(consumer: F => FileVisitResult)

のようにオーバーロードしておけば、オプションを指定しない場合に

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

のようにできる。 ただ、オプションを指定しないときに括弧 () を省略するためだけにここまでするのは面倒だw

さて、まぁ traverse() メソッドみたいなのは通常の Scala コードでどの程度出てくるのか分からないので必要性があまり感じられない気もするけど、ちょっと前に Scala.js で JavaScript のライブラリを Scala コードから呼び出すときに Three.js をイジってたとき、いろいろなクラスのコンストラクタにこういう感じのパラメータオブジェクトを受け取るものが多用されてたので、Scala.js のためのブリッジライブラリを作る際に使えるかもしれない。(というかそのうち作るつもり。 つーか、コード生成するコードを書く予定)

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

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


ツイート (ツイート数 25)