Feature #818
closedEnumerator#inspect
Description
=begin
まつもと ゆきひろです
In message "Re: [ruby-dev:37259] Re: [Feature:1.9] Enumerator#inspect"
on Wed, 3 Dec 2008 17:32:59 +0900, "Akinori MUSHA" knu@iDaemons.org writes:
|> Enumerator の中身をわかりやすく表示してくれる Enumerator#inspect を
|> 提供すると便利だと思います。例えばこんな感じ。
|>
|> $ ruby19 -e 'g = (1..1000).each; p g'
|> #<Enumerator:[1, 2, 3, ...(snipped)]>
|>
|> 現状は #Enumerator:0x8269654 とかなので、デバッグには不便です。
|
| inspect で実際に回してしまうのは(中身を見るための)副作用として
|大きすぎ、適切ではない気がします。
そうですねえ。IOのように再開可能でないEnumerableもありますし
ねえ。私もあまり賛成できません。わかりやすくするというアイディ
アには反対ではないんですが。
Enumeratorの中に最初の3要素を取っておくとかは、たぶんやりすぎ
でしょうねえ。
=end
Updated by usa (Usaku NAKAMURA) over 16 years ago
=begin
こんにちは、なかむら(う)です。
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
とか。
でも、どんな出方が嬉しいかは、デバッグのやり方によるんでしょ
うねえ。
なお、私は動いてるスクリプトの中にpを何個かばらまいて挙動を追
ったりするので、pの有無で(stdoutへの出力以外に)動作が変化して
しまう可能性があるのはあんまり嬉しくないです。
それでは。¶
U.Nakamura usa@garbagecollect.jp
=end
Updated by mame (Yusuke Endoh) over 16 years ago
=begin
遠藤です。
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
=end
Updated by ko1 (Koichi Sasada) over 16 years ago
- Assignee set to matz (Yukihiro Matsumoto)
=begin
=end
Updated by knu (Akinori MUSHA) over 16 years ago
- Status changed from Open to Closed
=begin
Committed on trunk.
=end
Updated by yugui (Yuki Sonoda) over 16 years ago
=begin
Yuguiです。
Akinori MUSHA さんは書きました:
そうですね。IO系のように、オブジェクト内部に走査中の位置が保持
されているものは rewind できていませんね。1.8 と 1.9 で挙動が
異なっているのもまずいかも。オブジェクトの respond_to?(:rewind) が真だったら rewind を呼ぶ
ようにすべきなのかな。
バージョン間一貫性でいうと、1.9.1と1.9.2でrewindの挙動が違うのも悩ましい
と思います。結構大きな仕様変更だと思うんですが、これ、1.9.1に取り込むべ
きだと思いますか?
--
Yugui yugui@yugui.jp
http://yugui.jp
私は私をDumpする
=end