今日も,クロージャ

「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

ひょほ,こりゃ面白い.ちゃんと呼ばれた回数がでてますね.


それでは,今日はこれまで.おやすみなさい.