Rubyのyield文

プログラミング

プログラムはできるだけシンプルに分かりやすく記述することで、バグや認識違いを少なくすることができます。

Rubyのyield文は、メソッドへ処理を渡す記述をシンプルに記述することが出来る手法の1つです。

本記事では、Rubyのyield文について解説します。

記事内に記載しているプログラムは、Ruby2.7.1を使って動作確認をしています。

Rubyのyield文

Rubyのyield文について、以下の内容を解説します。

  • yield文とは
  • yield文の基本形
  • yield文に引数を指定する方法
  • 複数回のyield文の実行
  • ブロック引数の確認方法
  • 明示的なブロック引数の利用

yield文とは

Rubyのyield文を一言で表すと、引数で渡されたブロックを呼び出す文のことになります。

JavaScriptの言語などでは、関数の引数として関数自体を渡すことができます。
Rubyのメソッドでは、メソッド自体を引数にすることは出来ませんが、ブロックを渡すことができます。

ブロックとは、do-endや{}で囲われた一連の処理のかたまりのことです。
その渡された一連の処理を実行するために使うのがyield文となります。

yield文の基本形

yield文を使った基本的なプログラムは以下のようになります。

def func
    yield
end

func { puts "Ruby" }
func do
    puts "Ruby"
end

上記のプログラムでは、funcメソッドの中で引数として渡されたブロックを呼び出しています。
呼び出し側では、渡すブロック(puts文)を記述しています。
{} でも do-end でも、どちらともputs文が実行され、”Ruby” と表示される結果となります。

yield文に引数を指定する方法

引数で渡すブロックの処理に対して、外からパラメータを渡して処理したい場合は、yield文にそのパラメータを指定することができます。

def func2
    yield(1, 2)
end

func2 {|a, b| puts a + b}

上記のプログラムでは、ブロックの処理で2つのパラメータを受け取っています。
yield文では、その2つのパラメータを指定しています。

また、ブロック内の処理で戻り値をreturnして、yield文に渡すこともできます。

複数回のyield文の実行

複数回のyield文を指定した場合は、その回数分ブロックが処理されます。

def func3
    yield 10
    yield 20
    yield 30
end

func3 {|a| puts a * 2}

上記のプログラムでは、yield文を3回呼び出しているので、ブロック処理が3回行われ、以下の結果となります。

20
40
60

ブロック引数の確認方法

yield文を記述するメソッドに、ブロックが引数で指定されてないと、例外が発生します。
そのため、通常yield文を使う際は、ブロックが引数に指定されているかどうかを確認して実行します。

確認するためのメソッドが、block_given? になります。

def func4
    puts block_given?
    yield if block_given?
end

func4 { puts "Ruby"}
func4

上記のプログラムでは、後置ifによってブロックが渡された時だけ、yield文による処理を実行します。
1回目はブロックを渡し、2回目はブロックを渡さずに実行した上記の結果は以下のようになります。

true
Ruby
false

1回目は、block_given?の結果がtrueとなるので、ブロックの処理が実行されます。
2回目は、block_given?の結果がfalseとなるので、ブロックの処理が実行されずに終了となります。

明示的なブロック引数の利用

ここまではブロック引数の実体がなく、yield文によって呼び出していましたが、同じことを以下のように記述することもできます。

def func5(&proc)
    proc.call
end
func5 { puts "Ruby"}

上記のプログラムでは、func5の引数に & を付けて受け取っています。
この引数がブロック引数を表していて、実行するにはyield文ではなく、callメソッドで呼び出します。

まとめ

Rubyのyield文についてまとめると、以下となります。

  • yield文とは、引数で渡されたブロックを呼び出す文のことである。
  • yield文では、ブロックに対して引数を渡したり、戻り値を受け取ったりすることもできる。
  • ブロック引数が存在するか確認したり、明示的にブロック引数を変数として利用することもできる。

使いどころに迷うyieldですが、メソッドの拡張などの際に使用することを検討してみてはいかがでしょうか。

 

今回は、Rubyのyield文について解説しました。

以上、参考になれば幸いです。

コメント

タイトルとURLをコピーしました