クロージャの復習

しつこいようだが、もう一度。

  • Procを使ったやり方
def closure1 arr, &proc
  print "start !\n"
  proc.call arr
  print "end !\n"
end

p = Proc.new {|arr|
  arr.each do |m|
    puts "put #{m} !"
  end
}

@curry = %w{ garlic ginger red-pepper onion tomato spices meat salt carrot potato } 

closure1 @curry, &p

こんな感じ。
ちなみに、最後の行は、以下のようにも書ける。

  • Procを使ったやり方2
closure1(@curry) {|arr|
  arr.each do |m|
    puts "put #{m} !"
  end
}
  • yieldを使ったやり方
def closure2 arr
  print "start !\n"
  yield arr
  print "end !\n"
end

@pudding = %w{ egg milk suger vanilla-essence } 

closure2(@pudding) {
  @pudding.each {|a|
    puts "Buy #{a}."
  }
}

ようやく消化できたような。
yieldの場合は即効性、Procやパラメータに&を付ける場合は、汎用性が重視されるときに良さそう。