メタプログラミング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回勉強会にいこう