Project

General

Profile

Feature #818

Enumerator#inspect

Added by matz (Yukihiro Matsumoto) almost 11 years ago. Updated over 8 years ago.

Status:
Closed
Priority:
Normal
Target version:
-
[ruby-dev:37261]

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:0x8269654 とかなので、デバッグには不便です。
|
| inspect で実際に回してしまうのは(中身を見るための)副作用として
|大きすぎ、適切ではない気がします。

そうですねえ。IOのように再開可能でないEnumerableもありますし
ねえ。私もあまり賛成できません。わかりやすくするというアイディ
アには反対ではないんですが。

Enumeratorの中に最初の3要素を取っておくとかは、たぶんやりすぎ
でしょうねえ。
=end

History

#1

Updated by usa (Usaku NAKAMURA) almost 11 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:0x8269654 とかなので、デバッグには不便です。
|
| inspect で実際に回してしまうのは(中身を見るための)副作用として
|大きすぎ、適切ではない気がします。

そうですねえ。IOのように再開可能でないEnumerableもありますし
ねえ。私もあまり賛成できません。わかりやすくするというアイディ
アには反対ではないんですが。

Enumeratorの中に最初の3要素を取っておくとかは、たぶんやりすぎ
でしょうねえ。

実現可能かどうかは考慮してないんですが、実際の中身よりもその
Enumeratorオブジェクトがどこから出てきたのかがわかる方が嬉し
いような気がします。
上記の例だと、例えば
#Enumerator:Range#each
とか。

でも、どんな出方が嬉しいかは、デバッグのやり方によるんでしょ
うねえ。
なお、私は動いてるスクリプトの中にpを何個かばらまいて挙動を追
ったりするので、pの有無で(stdoutへの出力以外に)動作が変化して
しまう可能性があるのはあんまり嬉しくないです。

それでは。
--
U.Nakamura usa@garbagecollect.jp

=end

#2

Updated by mame (Yusuke Endoh) almost 11 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:0x8269654 とかなので、デバッグには不便です。
|
| inspect で実際に回してしまうのは(中身を見るための)副作用として
|大きすぎ、適切ではない気がします。

そうですねえ。IOのように再開可能でないEnumerableもありますし
ねえ。私もあまり賛成できません。わかりやすくするというアイディ
アには反対ではないんですが。

Enumeratorの中に最初の3要素を取っておくとかは、たぶんやりすぎ
でしょうねえ。

実現可能かどうかは考慮してないんですが、実際の中身よりもその
Enumeratorオブジェクトがどこから出てきたのかがわかる方が嬉し
いような気がします。
上記の例だと、例えば
#Enumerator:Range#each
とか。

まあ、デバッグ用だから見せてしまってもいいかもしれませんね。

(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

#3

Updated by ko1 (Koichi Sasada) almost 11 years ago

  • Assignee set to matz (Yukihiro Matsumoto)

=begin

=end

#4

Updated by knu (Akinori MUSHA) almost 11 years ago

  • Status changed from Open to Closed

=begin
Committed on trunk.
=end

#5

Updated by yugui (Yuki Sonoda) almost 11 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

Also available in: Atom PDF