まつもと ゆきひろです

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

|> ただ,IO.openもそうですが,ブロックが与えられたかどうかで全
|> く違う戻り値を返して良いのか,というのが若干悩む点で,仕様を
|> 変更するのはその辺について結論を出してからにしたいです.
|
|既存のiteratorとしても非iteratorとしても使えるbuiltin methodで、返り値
|が違うものとしてEnumerable#grepとString#scanがあります。

なるほど,非常に説得力がありました.採用しましょう.^^;;;

|		非iteratorの値			iteratorの値	
|-------------------------------------------------------------
|Enumerable#grep	grepの結果の配列		self
|String#scan	マッチした配列(の配列)		nil 
|
|2つともiteratorの場合に返された値を積極的に使う事はあまり意図されては
|いないようですが。

ところで,「意味のない場合の戻り値」はnilとselfの場合の両方
があって統一されてませんですね.これは統一した方が良いのでしょ
うか?

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

ええと,「ブロックを1回だけ実行するイテレータ」で良いのでし
たら簡単ですが,それで良いんでしょうか.というのも文字列で与
えるevalと「1回だけ実行するイテレータ」とでは初出のローカル
変数の挙動がかなり違うんですが.

  * 通常のeval - ローカル変数が定義され,スコープに追加され
    る.次回のevalで参照できる

  * イテレータ - そのブロック内で初出のローカル変数はそのブ
    ロックを抜けた時点で消え失せる

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

これはそうしようかなあ,と思います.反対の方は居ます?
# みんな使ってなかったに違いない.

                                まつもと ゆきひろ /:|)