青山です。

On Wed, 8 Dec 1999 02:53:37 +0900,
Hiroshi Saito <HiroshiSaito / pob.org> wrote:

> つまり、イテレータのブロックでの結果をイテレータ本体に
> 持ち越すことはできますか?

ごとけんさんが書かれているように、Array#filter というものがあります。
あるいは、持ち込んでさらに何かしたいという事であれば、Array#filter の
中身はこんな感じなので、適当に手を加えても良いでしょう。

a = [1,2,3,4,5]
def a.itr()
  for i in 0...self.size
    self[i] = yield(self[i])
  end
end

a.itr do |i|
  i += 10  # Ruby では代入は破壊的動作ではありません。この場合以外につ
           # いても、代入が元のオブジェクトに影響を与える事はありません。
  print i, ","
  i  # ブロックの最後の値が yield の値となります。
end

array[i] = や hash["key"] = は、Array, Hash の []= メソッドであり、こ
れらは代入のように見えますが、要素のセットをするメソッドです。Hash で
は hash.store("key", "value") という別名もあります。

このようなメソッド以外の、代入*演算子*は、変数とオブジェクトを関連付け
るだけであり、そのオブジェクトに対してはなんら影響を与えません。(GC は
別として)


-- 
青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>