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