サイト更新情報
[Categories]
agile | angularjs | barbecue | birthday | body scoop | car | chuork01 | dinner | domin life | drive | event | fes | fishing | friend | gunpla | javascript | life | lunch | photo | ps3 | rails | ruby event | sake | software-development | sports snowboard | study event | sushi | sweets | techmix-hokkaido | torne | travel | vegetable garden | vim | weight training | whiskey | work

Ogagaga Diary


2011年05月25日

メタプログラミングRubyの写経 第3章 ブロック

第3章 ブロック

  • ブロック基本(使いどころをよくわかっていない)
    • メソッドはyeildキーワードでコールバックする
    • 本のサンプルはわかりにくかったので以下のサンプルを書いてみた
def hoge
  puts "yieldは実行されません"
  puts "このあとにブロックが実行される"
  yield(1,2)
  puts "ここからyield後の処理だよ"
  puts "hogehoge"
  puts "fugafuga"
end

hoge do |x,y|
  sum = x+y
  puts "#{x}+#{y}=#{sum}"
end
    • ブロックの有無 Kernel#block_given?
    • Kernel にメソッドを追加すれば、すべてのオブジェクトで利用できるようになる
  • 以下のコードはなんか心にささったのでメモしておく
module Kernel
  def using(resource)
    begin
      yield
    ensure
      resource.dispose
    end
  end
end
  • ブロックがローカル束縛を一緒に連れて行く(クロージャ)
  • Ruby1.8以前だとブロックは同名のローカル変数を書き換える
  • local_variables 現在のスコープで定義されているローカル変数名
  • フラットスコープ class → Class.new(), module → Module.new()
  • instance_eval() オブジェクトのコンテキストでブロックを評価する

今日はこれでおしまい。続きは以下から。

  • 呼び出し可能オブジェクト
    • proc オブジェクト