2009/06/01

Groovyイン・アクション読書会IN関西 第2回

Groovyイン・アクション読書会IN関西 いってきたよに引き続き、第2回に参加してきた。

利用できる人はskypeのオープンチャットを利用したのだけれども、僕のubuntuでのskypeはオープンチャットできなかった。linuxのskypeはv2.0で止まっているみたい。v2.6ぐらいからオープンチャット可能ということなので。残念。気づいたことをアップしてきたかった。

読書会で一番しれてよかったのはクロージャの再帰呼び出しの方法かな。

今まで再帰呼び出ししたいと思った場合には、

  1. メソッドを定義して再帰
  2. 一度空の変数を作成してから、再帰呼び出しクロージャの定義

といずれかを行っていた。

1の例

def x(n){
    if( n > 0 ){
        print n
        x(n-1)
    }
}
x(5)

2の例

def x
x = { n ->
    if( n > 0 ){
        print n
        x(n-1)
    }
}
x(5)

クロージャで再帰呼び出しすることはできないと思ってたのデスが、以下のようにcallメソッドを使えば可能。

def x = { n ->
    if( n > 0 ){
        print n
        call(n-1)
    }
}
x(5)

それから、クロージャのasWritableメソッドが正常に動かない。

asWritableメソッドを使用して作成したクロージャのクローンは、実行後に結果を出力する設定が可能なwriteToメソッドがつかされるということなので試してみた。

def x = { "3" }.asWritable()
System.out.withWriter{ w ->
    x.writeTo(w)
    x()
    w << "a"
}

 結果では"3a"と出力されると思ったけど"a"しか出力されない。しかもコード実行後にはprintlnメソッド使用できなくなるし。使い方が間違っているのだろうか。うーん。

なんにせよ今回も楽しかった。読書会終了後の懇談会が飲みながらコーディングでなんだかわけがわからないコード書いていた。

1 件のコメント:

  1. def x = { out -> out << "3" }.asWritable()
    System.out.withWriter{ w ->
    x.writeTo(w)
    w<<"a"
    }
    ですかね。
    printlnができなくなるのはwithWriterがクローズしてしまうからですねきっと。

    返信削除