IT技術にまつわる実験ノート

「長編を書くより、短編を数多く完成させてください。それが上達への近道です」 by 手塚治虫

yield のドキュメントを読んでみる

yield とは…?

ドキュメントでの yield の説明は、以下の通り。

yield は イテレータを定義するために クラス/メソッドの定義/メソッド定義 内で使用します。

引数をブロックパラメータとして渡してブロックを評価します。

また yield を実行したメソッドにブロックが渡されていない (ブロック付きメソッド呼び出しではない)時は例外 LocalJumpError が発生します。

 イテレータとは…?

 ブロック付きメソッドとは制御構造の抽象化のために用いられる メソッドです。最初はループの抽象化のために用いられていたため、 特にイテレータと呼ばれることもあります。 do ... end または { ... } で囲まれたコードの断片 (ブロックと呼ばれる)を後ろに付けてメソッドを呼び出すと、その メソッドの内部からブロックを評価できます。 ブロック付きメソッドを自分で定義するには yield 式を使います。

 

使ってみる

foo メソッド内で yield を呼び出す。yield に渡した値は、fooメソッド呼び出し時に、引数で渡すブロック内の処理で使うことができる。

f:id:matt-note:20181020223501p:plain

f:id:matt-note:20181020223509p:plain

 

上記の foo メソッドにブロックを渡さなかった場合、エラーになる

f:id:matt-note:20181020224851p:plain

 

引数に配列を受け取る iichメソッドを定義。iich メソッド内で yield は配列の値を順にブロックに渡すことになる。iich メソッド呼び出し時に引数で渡すブロックでは、要素の値を変数 sum に足す処理を定義。iichメソッドで  Ruby の each メソッドっぽい動作をさせることができる。

f:id:matt-note:20181020225833p:plain

 

 

まとめ

とにかく、自分でブロック付きメソッドを定義する場合、メソッド内で yield 式を使う。ブロック付きメソッドとは制御構造の抽象化のために用いられる メソッド。