メタプログラミングRuby 第3章水曜日 ブロック

  • Kernel#block_given?()メソッドでブロックの有無を確認できる
  • プログラムが新しいスコープをオープンする場所は3つ
    • クラス定義(class)
    • モジュール定義(module)
    • メソッド呼び出し(def)
  • こういうのをスコープゲートという
  • classをClass.newにするとスコープゲートがなくなる。これを入れ子構造のレキシカルスコープとかスコープのフラット化という
irb(main):009:0* name = 'chunky Bacon'
=> "chunky Bacon"
irb(main):010:0> Class.new do
irb(main):011:1* p name
irb(main):012:1> end
"chunky Bacon" #<= ベーコンがある
=> #<Class:0x2ae87aeb1a58>
irb(main):013:0> class MyClass
irb(main):014:1> p name
irb(main):015:1> end
"MyClass"
=> nil #<= ベーコンがない
  • instance_evalでカプセル化を破壊できる(コンテキスト探査機とよばれる)
  • ブロックは引数に&をつけることで名前つきで受け取れる
  • Procをブロックに戻すこともできる
  • Procとlambdaは別物
    • returnが違う(lambdaはlambdaからもどる、Procは定義されたスコープから戻る)
    • Procのほうが引数に寛容
  • とりあえず迷ったらlambdaを使っておけ
  • Object#method()でメソッドをオブジェクトとして取得でき、あとでcallで呼び出せる
  • Method#unbind()でオブジェクトからメソッドを引き離せる
  • bind()で戻せる

以上、さあRuby東海 第16回勉強会にいこう