Rubyにはブロック構文(ブロック付きメソッド)という構文があります。このブロック構文の使い方について説明します。
ブロック構文の例
ブロック構文は、eachメソッドなどで使われます。eachメソッドは、配列[1, 3, 7, 2, 5]の要素を1つずつ取り出し、do-endの記述された処理を実行します。
1 2 3 |
[1, 3, 7, 2, 5].each do |x| puts x end |
xは、取り出された要素が入る変数(ブロック引数)で、そのxについてdo-endまでのことを行ないます。このdo~endをブロック構文と言います。do-endを{ }に置き換えて、以下のように記述することもできます。
1 |
[1, 3, 7, 2, 5].each do { |x| puts hensu } |
do-end 、{ } いずれの形式でも構わないのですが、1行に収まるときは{ }、複数行になるときはdo endが好まれる傾向があります。
ブロック構文を使ったメソッドの作成
ブロック構文を使ったメソッドは、メソッドに渡されたブロックを実行するyieldを使うことで記述できます。
1 2 3 4 5 6 7 |
def block yield end block do puts "This is block"; end |
また、yieldに引数を渡すことで、ブロック引数として使うことができます。以下では、"block"をブロック引数のnameに渡しています。
1 2 3 4 5 6 7 |
def block yield "block" end block do |name| puts "This is " + name; end |
実行結果
1 |
This is block |
クラスでブロックつきメソッドを使う
また、クラスでもブロックつきメソッドを定義することはできます。以下は、簡易版のeachメソッドをSampleEachクラスに定義する例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class SampleEach #初期化時にインスタンス変数@arrayに配列を入れる def initialize(array) @array = array end #簡易版eachメソッド def each i = 0 while i < @array.length #yieldでブロック引数に@array[i]を渡す yield @array[i] i += 1 end end end instance = SampleEach.new([1,2,3,4,5]) instance.each do |x| puts x end |
実行結果
1 2 3 4 5 |
1 2 3 4 5 |