From: Yusuke ENDOH Date: 2008-12-03T20:36:41+09:00 Subject: [ruby-dev:37264] Re: [Feature:1.9] Enumerator#inspect 遠藤です。 2008/12/03 19:57 Akinori MUSHA : > At Wed, 3 Dec 2008 18:39:59 +0900, > U.Nakamura wrote: >> In message "[ruby-dev:37261] Re: [Feature:1.9] Enumerator#inspect" >> on Dec.03,2008 18:17:53, wrote: >> > |> Enumerator の中身をわかりやすく表示してくれる Enumerator#inspect を >> > |> 提供すると便利だと思います。例えばこんな感じ。 >> > |> >> > |> $ ruby19 -e 'g = (1..1000).each; p g' >> > |> # >> > |> >> > |> 現状は # とかなので、デバッグには不便です。 >> > | >> > | inspect で実際に回してしまうのは(中身を見るための)副作用として >> > |大きすぎ、適切ではない気がします。 >> > >> > そうですねえ。IOのように再開可能でないEnumerableもありますし >> > ねえ。私もあまり賛成できません。わかりやすくするというアイディ >> > アには反対ではないんですが。 >> > >> > Enumeratorの中に最初の3要素を取っておくとかは、たぶんやりすぎ >> > でしょうねえ。 >> >> 実現可能かどうかは考慮してないんですが、実際の中身よりもその >> Enumeratorオブジェクトがどこから出てきたのかがわかる方が嬉し >> いような気がします。 >> 上記の例だと、例えば >> # >> とか。 > > まあ、デバッグ用だから見せてしまってもいいかもしれませんね。 > > (1..100).each_cons(2) => "#" > > という感じでどうでしょうか。(下に添付) おお、要は「Enumerator の正体を p だけで (ある程度) 知りたい」という ことなので、これで十分です。 . ではなく : なのがちょっと引っかかりますが、細かいことです。 完全に満足したので、以下は蛇足ですが。 副作用のあるメソッドから Enumerator を作って変なことになるのは、自己責任 だと思っていました。 なぜかというと、IO#each から作った Enumerator を rewind しても無視される という (私にとっては) 不可解な挙動をするためです。 $ ruby19 -rstringio -e ' s = StringIO.new("foo\nbar\n").each p s.next s.rewind p s.next ' "foo\n" "bar\n" これから何を感じ取ったかというと - rewind は実際には rewind せず、種のメソッドを呼び直すという意味である - それにも関わらず rewind という名前が付けられている - Enumerator の種となるメソッドは呼び直すと最初から列挙し始めるという 性質 (つまり Array#each のようなの) が期待されている - それ自体が副作用を持つようなメソッドで Enumerator を作るのは自己責任 という雰囲気でした。蛇足でした。 -- Yusuke ENDOH