今日も,クロージャ
「naoyaのはてなダイアリー - Perlのクロージャ(TB飛ばさないように・・・)」で行われてる事を,Rubyで出来るかやってみてますが,思いのほか出来なくて凹んでます.
サブルーチンテンプレート
例えば,サブルーチンテンプレートとしてのクロージャ.配列名を新しい変数名にするのって,どーするんだ???
colors = { "red" => nil, "blue" => nil, "green" => nil } colors.each_key{|color| colors[color] = lambda{|str| "<font color='#{color}'>#{str}</font>" } } str = colors["red"].call("foo") puts str str = colors["blue"].call("bar") puts str str = colors["green"].call("hoge") puts str $ ruby lambda_test6.rb <font color='red'>foo</font> <font color='blue'>bar</font> <font color='green'>hoge</font>
なんかもう,しゃーないのでハッシュでやってみました.ハッシュのkeyに対するvalueがブロック・・・これってクロージャしてるのかな.いやはや,突然Perlが偉大に見えてきたよ.正直これじゃサブルーチンテンプレートと呼んで良いものやら.
カウンターとしてのクロージャ
クロージャを使ってカウンタを作り、それをもって数えるという方法。グローバル変数でこれをやるのはちょっと嫌な感じですが、クロージャにすれば、カウンタを局所化できるとか、あるいはクロージャを複数生成すればそれごとにカウンタを持つことができるといった利点が得られます。
やりたい,こういう事やりたい.簡単ではあるけど,やってみた.
def counter count = 0 return lambda{ puts count += 1 } end hoge1 = counter hoge2 = counter hoge1.call hoge1.call hoge2.call hoge1.call hoge2.call $ ruby lambda_test7.rb 1 2 1 3 2
ひょほ,こりゃ面白い.ちゃんと呼ばれた回数がでてますね.
それでは,今日はこれまで.おやすみなさい.