[#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:37268] Re: [Feature:1.9] Enumerator#inspect

From: "Akinori MUSHA" <knu@...>
Date: 2008-12-04 02:28:45 UTC
List: ruby-dev #37268
At Wed, 3 Dec 2008 20:36:41 +0900,
Yusuke ENDOH wrote:
> 2008/12/03 19:57 Akinori MUSHA <knu@idaemons.org>:
(snip)
> > まあ、デバッグ用だから見せてしまってもいいかもしれませんね。
> >
> > (1..100).each_cons(2) => "#<Enumerator: 1..100:each_cons(2)>"
> >
> > という感じでどうでしょうか。(下に添付)
>
>
> おお、要は「Enumerator の正体を p だけで (ある程度) 知りたい」という
> ことなので、これで十分です。
> . ではなく : なのがちょっと引っかかりますが、細かいことです。

 . だとRangeなどの場合特に Ruby の式っぽく見えるけれども、

- inspect の結果なのでそもそも式ではない

- 式のように見える分、 Range の場合など () で括らないといけない
  気がして煩わしい

という感じがしたので : にしました。

> 完全に満足したので、以下は蛇足ですが。
>
> 副作用のあるメソッドから 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 を作るのは自己責任
>
> という雰囲気でした。蛇足でした。

そうですね。IO系のように、オブジェクト内部に走査中の位置が保持
されているものは rewind できていませんね。1.8 と 1.9 で挙動が
異なっているのもまずいかも。

オブジェクトの respond_to?(:rewind) が真だったら rewind を呼ぶ
ようにすべきなのかな。

--
Akinori MUSHA / http://akinori.org/

In This Thread