@kyanny's blog

My life. Opinions are my own.

第三章 水曜日 ブロック

  • yield, block_given?
  • ブロック、クロージャ、スコープ
    • スコープゲート、「スコープの門」 (スケープゴートと見間違えやすい) class, module, def
  • 余談: Perl の my $var = 1 と Ruby の var = 1 は全然違う (理解できてなかった)
    • http://floralcompany.jp/archives/2008/05/rubyperl.html に詳しいまとめ
    • Perl の my はレキシカルスコープなので「外側のスコープから内側のスコープの変数は見えない」が「内側のスコープから外側のスコープの変数は見える」
    • Ruby のローカル変数は「外側のスコープから内側のスコープの変数は見えない」し「内側のスコープから外側のスコープの変数も見えない」
  • スコープのフラット化
    • Class.new, Module.new, define_method (うしろにブロック)
  • instance_eval
> obj = Object.new
=> #<Object:0xb76e7320>
> obj.instance_eval{ p self }
#<Object:0xb76e7320>
=> nil
  • instance_eval とフラットスコープ (コンテキスト探査機)
    • カプセル化の破壊
> class << obj
> attr_accessor :attr
> end
=> nil
> obj.instance_eval{ @attr = 100 }
=> 100
> obj.attr
=> 100
  • クリーンルーム (これちょっと意義がわからない)
  • 呼び出し可能オブジェクト - ブロック, Proc, lambda, proc
    • &修飾子
    • Proc と lambda の違い
      • ブロックの中で return したときの振る舞い
      • arity (項数) に対する厳格さ
  • メソッド - 呼び出し可能オブジェクトとして
    • Object#method, Method#call, Method#unbound, Method#bind, Method#to_proc
  • まとめ: 呼び出し可能オブジェクトとは
    • 評価できる
    • スコープを持ち運べるコードの塊
  • DSL (ドメイン特化言語)