お薦め ページ


メニュー

ハワイ島 遊覧飛行ツアー

ハワイ島 B&B・ホテル

ハワイ島 不動産情報

ハワイ島 情報・観光ガイド

ブログ(Blog)

その他

関連サイト

: 個別エントリー・アーカイブ :

2006年12月 2日

Ruby の ブロック付きメソッド呼び出し

昨日のブログで「イテレータ」について書いたが、 最近のRubyの世界ではそれを「ブロック付きメソッド」と呼ぶほうが好まれているようだ。

まず、「ブロック付きメソッド」の定義。 Ruby リファレンスマニュアル 「ブロック付きメソッド呼び出し」 によると、 「ブロック付きメソッドとは制御構造の抽象化のために用いられる メソッドです。」 とある。 「最初はループの抽象化のために用いられていたため、 特にイテレータと呼ばれることもあります。」 この説明からも判るとおり、 もともと ループの抽象化を目的としていたので「イテレータ」と呼ばれていたようだが、 繰り返し処理でなく1度きりの処理であっても 制御構造を抽象化したい場合に、同様の記述が可能であるということから、 最近ではもっと汎用的に「ブロック付きメソッド呼び出し」と呼ぶようになっているようである。

では自分で定義したブロック付きメソッドから 引き渡されたブロックを呼び出す方法。 そのためには「yield」をメソッド定義内で記述する必要があるようだ。 詳しくは Ruby リファレンスマニュアルの 「yield」 に解説してある。

この「yield」を含めた「ブロック付きメソッド呼び出し」の 私なりの理解の方法の例を挙げてみる。
def foo            # メッソド foo の定義 
  fooprint(5)
end

def fooprint( i )  # メッソド fooprint の定義
  p i+10
end
foo                # メッソド foo を呼ぶ

def fooprint( i )  # メッソド fooprint の再定義
  p i+20
end
foo                # メッソド foo を再び呼ぶ
この例では、まず foo というメッソドを定義している。 この fooの中から fooprint というメッソドを引数「5」で呼び出すことにする。 次に、fooprint というメッソドを定義しており、 その処理内容は 引数「i」に「10」を足してから表示する、というもの。 その直後に メッソド「foo」を呼び出している。 続いて再び、メッソド「fooprint」を定義しなおしている。 その処理内容は 引数「i」に「20」を足してから表示する、というもの。 その直後に再び メッソド「foo」を呼び出している。

上の例を 「yield」を使った「ブロック付きメソッド呼び出し」で記述してみると
def foo
  yield(5)  # fooprint(5) の代わり
end

foo do |i|  # do |i| は def fooprint( i ) の代わり
  p i+10
end

foo do |i|  # do |i| は def fooprint( i ) の代わり
  p i+20
end
となる。 こちらの例では ブロックをメッソド「foo」に直接 引数として渡しており、 前の例であった「fooprint」というメソッド定義がなくなっている。 上記2つのスクリプト例を実行してみると
15
25
となる。

自分としては、この様なイメージで 「ブロック付きメソッド呼び出し」を理解している。

【参考リンク】

カテゴリー: Ruby     2006年12月 2日 22:44

トラックバック

このエントリーのトラックバックURL:
http://www.skymerica.com/blog/yotsumoto/mt/mt-tb.cgi/636


コメント

コメントしてください




保存しますか?


 
ハワイ島での遊覧飛行ツアーとB&Bのスペシャリスト、スカイメリカ
Copyright © 2003,2009 Skymerica Corp. All rights reserved.