GroovyとRuby
前回作ったマクロはjFD2の作者にも使ってもらえたようだ。
で、「ファイルの表示順を大文字小文字を区別しないようにして欲しい」とのリクエスト。検索では大文字小文字区別していないのだから当然の要求である。自分では小文字のショートカットしか使っていないので気付いていなかった。
該当部分は
files=files.sort()
とりあえず
files=files.sort(){x,y->x.toLowerCase()>y.toLowerCase()?1:-1}
とした。JavaならComparetorを実装して渡すところだしGroovyでも同様にできるのだが、たぶんクロージャを渡してもOKだと思ってやってみたら問題なし*1。
後で、リファレンスを見るとRubyのように"<=>"演算子が使えるようなので
files=files.sort(){x,y->x.toLowerCase()<=>y.toLowerCase()}
でもいい。
しかし、ほんとはRubyの"sort_by"メソッドのように記述したかったので"sortBy"とか探したけれど見つからない。
そこで、物は試しと
files=files.sort(){it.toLowerCase()}
で、あっさり出来た。
現時点の最新のリファレンスを、どう読んでもこんな書き方が出来るようには解釈できないのだが・・。
実装にドキュメントが追随しきれないのは何処も同じとはいえ、現時点のGroovyのバージョンは1.5でjFD2に同梱されているバージョンは1.1。1.1での機能くらいは網羅していて欲しいところ。
Groovyの日本語で読める資料を探すとGroovy - Java用スクリプト言語にたどりつく。訳者が角谷さんなのでRuby使いとしては安心して読める。
とはいえGroovyが1.0になる前の資料を訳した物なので、今のバージョン(jFD2の1.1でも)ではエラーになる記述を今のところ2つ見つけた。
(1) クロージャの記述
との記述があるが、実際は
クロージャを定義する文法は、{ comma-separated-parameter-list | statements }
でないとエラーになる。
{ comma-separated-parameter-list -> statements }
(2) Range(範囲オブジェクト)の記述
との記述があるが、3...7はエラーになる。
3..7 は「3 から 7」を表す Range を生成する。
3...7 は「3 から 6」を表す Range を生成する。
上記2点、エラーになる記述はいずれもRubyと同じ書き方なのだが、それを1.0以降のバージョンで敢えて変えたのは何故なのか、ちょっと気になる。
*1:先にリファレンスを調べるべきなのだが、実家のネット環境が貧弱なので、オフラインで試せることは先