From: matz / netlab.co.jp (Yukihiro Matsumoto)
Subject: [ruby-dev:2726] Re: return value of iterator File.open and Dir.open
Date: Fri, 22 May 1998 10:20:46 +0900

> In message "[ruby-dev:2725] return value of iterator File.open and Dir.open"
>     on 98/05/21, Inaba Hiroto <inaba / st.rim.or.jp> writes:

> |その場合、現在イテレータの返り値はensureによってcloseされたFileまたは
> |Dirのインスタンスなのですが、これはイテレータブロックのかえす値の方が
> |便利ではありませんか?
> 
> えーと,「便利である」という点には同意します.
> 
> ただ,IO.openもそうですが,ブロックが与えられたかどうかで全
> く違う戻り値を返して良いのか,というのが若干悩む点で,仕様を
> 変更するのはその辺について結論を出してからにしたいです.

既存のiteratorとしても非iteratorとしても使えるbuiltin methodで、返り値
が違うものとしてEnumerable#grepとString#scanがあります。

		非iteratorの値			iteratorの値	
-------------------------------------------------------------
Enumerable#grep	grepの結果の配列		self
String#scan	マッチした配列(の配列)		nil 

2つともiteratorの場合に返された値を積極的に使う事はあまり意図されては
いないようですが。

また調べていて思いついたこと:

・instance_evalやmodule_evalと同じように、evalもイテレータとして使える
といいですね。前に提案した、ブロックを1回だけ実行するイテレータとして。

・Array#deleteやHash#deleteにブロックを与えると削除しようとしたものが
なかった時ブロックを実行してます。今はnilを返してますが、この場合もイ
テレータの返り値をブロックの返す値にしても良いと思います。昔からある機
能だとしたら、非互換になるのでまずいかもしれませんが。

--
			   稲葉 浩人 (inaba / st.rim.or.jp)