Rubyのブロックをお勉強
○参考
プログラミング言語 Ruby リファレンスマニュアル
1.ブロックって何?
{puts "Hello"} # これはブロック
do ### club.entroll(person) # これもブロック person.socialize # end ###
フレーズの方がdo/endよりも結合力が強い。
Rubyで標準になりつつある習慣は、1行のブロックにはフレーズ、複数行のブロックにはdo/endを使う。
2−1.メソッドを使い、ブロックを呼び出してみる。
メソッドの中からブロックを使用するには、yield制御構造、ブロック引数、 Proc.newの3種類の方法で行うことができます。
def call_block puts "Start of method" yield Proc.new.call proc.call lambda.call puts "End of method" end call_block { puts "In the block" } 出力結果: Start of method In the block In the block (irb):75: warning: tried to create Proc object without a block In the block (irb):76: warning: tried to create Proc object without a block In the block End of method
Ruby1.8.6ではproc.callとlambda.callは警告が出るけど、一応出力される。
2−2.ブロック引数を使って、呼び出してみる
ブロック引数は、メソッド定義の引数の最後に&methodという形で置かれ、メソッドの中で、method.call(args...)という形で呼ばれます。
def call_block(&b) b.call end call_block{ puts "In the block" } 出力結果: In the block
3.yieldのバラメータを呼び出す
def call_block yield("hello",99) end call_block{ |str,num| p str } call_block{ |str,num| p num } 出力結果: hello 99
def call_block yield("hello",99) yield("hello2",100) end call_block{ |str,num| p str } 出力結果: hello hello2
4.メソッドを呼び出すときに、そのメソッドをブロックに関連付ける
def take_block(p1) yield(p1) end take_block("Mac") {|s| s+" from Apple" } 出力結果: "Mac from Apple"
※環境
Ruby 1.8.6