イテレータ


イテレータのしくみ

Rubyの大きな特色のひとつがイテレータです。 (値の)引数はオブジェクトをパラメータ化するものですが、 イテレータは動作をパラメータ化します。 このような機能は「関数を受けとる関数」(高階の関数)によく対比されますが、 イテレータのブロックはブロックを実行する側のメソッドと 変数のスコープを共有するという一点において、高階の関数とは違うものです。

このような動作は、先に述べたような Ruby のスタックフレーム構造体を Ruby のスタックフレームから取りだし、再度適当なところにはさみこむことで 実現されています。

Proc のしくみ

Proc オブジェクトもイテレータと似た機能を持っていますが、 Proc はさらに直接的に、ブロックをオブジェクトとして持ちあるくことができます。 実装としては、struct BLOCK を VALUE にラップすることで達成できます。

イテレータブロックのうけわたし

Rubyでは、「&」引数を使ってイテレータブロックを Proc オブジェクトにし、 さらに他のメソッドに渡すことができます。