2010年1月 7日

Rubyブロック

ブロックとは?

Rubyでは、メソッドにデータを渡すだけではなく、処理も渡せます。
メソッドに渡された処理はブロックといいます。

ブロックを渡すには?

ブロックを渡すには、二つの方法があります。

test_block {puts 'In the block'}
test_block do
  puts 'In the block'
end

ブロックの使い方?

ブロックは使ってもらわないと、意味がありません。
使ってもらうということは、相手のメソッドが、ブロックの処理を実行することです。
メソッドの中で、渡されたブロックの処理を実行するには、yieldを使います。

def test_block
  # test_blockメソッドを定義する
  puts 'Start of method'
  yield
  puts 'End of method'
end

test_block {puts 'In the block'}

実行結果:

Start of method
In the block
End of method

ブロックにはパラメータを渡す?

ブロックにはパラメータを渡せますか?もちろんです。
パラメータの定義はブロックで、
yieldでブロックを実行する際には、パラメータを渡します。
ブロックは渡されたパラメータを受け取って、処理します。
文字の説明だけで、わからないかもしれません。
実はメソッドの定義とほとんど変わらないです。
サンプルを見てみましょう。

def test_block_pramater
  yield('helloworld')
end
call_block {|str, num| puts 'Ruby sample:'+str }

※注意点:ブロックでは、||でパラメータを受け取っています。

渡されたブロックをさらに別のメソッドを渡すには?

渡されたブロックをさらに内部で使っているメソッドに渡すことができます。
引数の最後に&付きの引数を指定してブロックを受け取リます。

def test_block(&block)
  # test_blockメソッドを定義する
  puts 'Start of test_block'
  test_block_paramater(&block)
  puts 'End of test_block'
end

def test_block_paramater(&block)
  puts 'Start of test_block_paramater'
  yield
  puts'End of test_block_paramater'
end

test_block {puts 'In the block'}

実行結果:

Start of test_block
Start of test_block_paramater
In the block
End of test_block_paramater
End of test_block

※One Point:ブロック引数を渡す時、&がつければ、引数名は何でも大丈夫です。

ブロックが渡されたか調べるには?

yieldを実行する時、ブロックが渡されるかどうかを確認することができます。
block_given?を使って、ブロックがあるかどうかを確認できます。

def test_block
  # test_blockメソッドを定義する
  puts 'Start of method'
  yield if block_given?
  puts 'End of method'
end

test_block {puts 'In the block'}
Share on Twitter Share the post
Qihuan Piao

朴 起煥

東京で働いている「外人歴」9年のソフトウェア「ライター」。いつの間にか納豆が食えるようになり、これで日本に慣れきったと思いきやまだまだ驚きが続いてる。読んだり書いたりするのが好きで、自身の経験や本から得た「何か」をここに書き出してる。最近古本屋にハマってる。

他にも英語中国語で書いてます、よろしければチェックしてみてください。