From: Akinori MUSHA Date: 2008-12-04T11:28:45+09:00 Subject: [ruby-dev:37268] Re: [Feature:1.9] Enumerator#inspect --pgp-sign-Multipart_Thu_Dec__4_11:34:37_2008-1 Content-Type: text/plain; charset=ISO-2022-JP At Wed, 3 Dec 2008 20:36:41 +0900, Yusuke ENDOH wrote: > 2008/12/03 19:57 Akinori MUSHA : (snip) > > まあ、デバッグ用だから見せてしまってもいいかもしれませんね。 > > > > (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/ --pgp-sign-Multipart_Thu_Dec__4_11:34:37_2008-1 Content-Type: application/pgp-signature Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (FreeBSD) iEYEABECAAYFAkk3Qb0ACgkQkgvvx5/Z4e6WnQCfXKCSRFBWTROGOjXW9eHVUJ6Z 38EAoIeCyvZHMU06344tbN4pYTD83P8a =aD37 -----END PGP SIGNATURE----- --pgp-sign-Multipart_Thu_Dec__4_11:34:37_2008-1--