[#37248] [Feature:1.9] Enumerator#inspect — "Yusuke ENDOH" <mame@...>

遠藤です。

12 messages 2008/12/02

[#37337] [Feature #841] Object#self — "rubikitch ." <redmine@...>

Feature #841: Object#self

13 messages 2008/12/09

[#37513] Current status of 1.9.1 RC1's issues — "Yugui (Yuki Sonoda)" <yugui@...>

Hi, folks

14 messages 2008/12/20
[#37516] Re: Current status of 1.9.1 RC1's issues — Masatoshi SEKI <m_seki@...> 2008/12/20

咳といいます。

[#37576] [BUG:trunk] encoding for stdio's — "Yugui (Yuki Sonoda)" <yugui@...>

Yuguiです。

11 messages 2008/12/24

[ruby-dev:37264] Re: [Feature:1.9] Enumerator#inspect

From: "Yusuke ENDOH" <mame@...>
Date: 2008-12-03 11:36:41 UTC
List: ruby-dev #37264
遠藤です。

2008/12/03 19:57 Akinori MUSHA <knu@idaemons.org>:
> 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, <matz@ruby-lang.org> wrote:
>> > |> Enumerator の中身をわかりやすく表示してくれる Enumerator#inspect を
>> > |> 提供すると便利だと思います。例えばこんな感じ。
>> > |>
>> > |> $ ruby19 -e 'g = (1..1000).each; p g'
>> > |> #<Enumerator:[1, 2, 3, ...(snipped)]>
>> > |>
>> > |> 現状は #<Enumerator:0x8269654> とかなので、デバッグには不便です。
>> > |
>> > | inspect で実際に回してしまうのは(中身を見るための)副作用として
>> > |大きすぎ、適切ではない気がします。
>> >
>> > そうですねえ。IOのように再開可能でないEnumerableもありますし
>> > ねえ。私もあまり賛成できません。わかりやすくするというアイディ
>> > アには反対ではないんですが。
>> >
>> > Enumeratorの中に最初の3要素を取っておくとかは、たぶんやりすぎ
>> > でしょうねえ。
>>
>> 実現可能かどうかは考慮してないんですが、実際の中身よりもその
>> Enumeratorオブジェクトがどこから出てきたのかがわかる方が嬉し
>> いような気がします。
>> 上記の例だと、例えば
>>   #<Enumerator:Range#each>
>> とか。
>
> まあ、デバッグ用だから見せてしまってもいいかもしれませんね。
>
> (1..100).each_cons(2) => "#<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 <mame@tsg.ne.jp>

In This Thread