From: matz@... (Yukihiro Matsumoto) Date: 1998-05-25T13:04:53+09:00 Subject: [ruby-dev:2739] Re: return value of iterator File.open and Dir.open まつもと ゆきひろです In message "[ruby-dev:2729] Re: return value of iterator File.open and Dir.open" on 98/05/23, Inaba Hiroto 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を返してますが、この場合もイ |テレータの返り値をブロックの返す値にしても良いと思います。昔からある機 |能だとしたら、非互換になるのでまずいかもしれませんが。 これはそうしようかなあ,と思います.反対の方は居ます? # みんな使ってなかったに違いない. まつもと ゆきひろ /:|)