Yokohama.groovy #5 に参加しました

2012/10/02 Yokohama.groovy #5 #yokohamagroovy - Togetterまとめ
20121002 vol.05 · yokohamagroovy/support Wiki · GitHub

諸事情によりしばらく参加できなかったので、1 ヶ月ぶりの参加です。
休んでる間に Github アカウントができてたり素晴らしいですね!

今回の参加者は 4 人。
いつも通りビール片手にゆるゆるとやってきました。

やったこと

プログラミングGROOVY

プログラミングGROOVY

範囲は "3.9 制御構造" から "3.12 Java との上位非互換" まで。
本の内容について思った事を話したり、写経して動かしてみたり。
PowerAssert 便利だよね、セミコロンレスって何がメリットなんだろうとか、色々話題はありましたが、今回の個人的メインは "3.11 正規表現処理" でした。

Groovy の正規表現

  • 文字列 ==~ /正規表現パターン/
    • 文字列全体がパターンにマッチするかどうか (true/false) を返す
  • 文字列 =~ /正規表現パターン/
    • java.utilregex.Matcher オブジェクトを返す
    • assert など真偽値で評価される場合、暗黙的に Matcher#find() が呼び出される
    • 結果としてパターンにマッチする部分が文字列に含まれているかどうかの判定に使える
    • 明示的に Matcher#matches() を呼び出せば、全体マッチの評価もできる

"=~" と "==~" の違いについては理解しましたが、部分マッチも全体マッチも "=~" で取得した Matcher を使って明示的に評価した方がコードが読みやすいと感じました。
"==~" の効果的な使い方が分からなかったので、たぶん、"=~" しか使わないんじゃないかと。

あと、リスト 3.91 の誤植で軽くハマりました。
正規表現部分をよく見ればわかったはずなんですけどね。情けない。

リスト 3.91

def expected = [['a', 'bb', 'ccc'], ['aaa', 'bb', 'c']]

def target = "a bb ccc aaa bb c"

i = 0
(target =~ /(a+) (b+) (c+)/).each {g0, g1, g2, g3 ->
	assert  [g1, g2, g3] == expected[i++]
}

i = 0
target.eachMatch(/(a+) (b+) (c+)/) { g0, g1, g2, g3 ->
	assert [g1, g2, g3] == expected[i++]
}

その他試したコードなど

assert "abcdef".matches(/a.c/)
assert "abcdef".matches(/a.c/)
                |
                false
assert "abcdef".find(/a.c/) == true
assert "abcdef".find(/a.c/) == true
                |           |
                abc         false
assert "abcdef".find(/a.c/) == "abc"

次回以降

多分、4 章 "Groovy のライブラリ" と 5 章 "進んだ話題" までやって一区切りかな。
進んだ話題の黒魔術 (の一端) が気になるところ。

その他

帰り道での雑談のメモ。

  • 野良 TDDBC みたいなのできたらいいよね
    • 講演なしで、ひたすらペアプロやるだけとか
      • TDD in Action みたいな
    • ドメイン特化したのとか
  • 『プログラミング Groovy』一区切りついてからのこと
    • エコシステムの理解を深める
    • ソースコードリーディング
    • 他の言語のレシピ本やってみる

そんな感じで、22 時過ぎに解散でした。
今回もとても楽しかったです。