Bug #2658
rubyspec: Ruby character strings interpolates the return value of Object#inspect, without ivars, if Object#to_s does not return a String instance ERROR
| Status: | Closed | Start date: | 01/26/2010 | |
|---|---|---|---|---|
| Priority: | Normal | Due date: | ||
| Assignee: | % Done: | 0% |
||
| Category: | core | |||
| Target version: | 1.9.2 | |||
| ruby -v: | ruby 1.9.2dev (2010-01-26 trunk 26425) [i686-linux] |
Description
まつもとさん
遠藤です。
rubyspec の以下のエラーを調べてみました。
9)
Ruby character strings interpolates the return value of Object#inspect, without ivars, if Object#to_s does not return a String instance ERROR
ArgumentError: wrong number of arguments(2 for 1)
/home/mame/work/ruby/spec/rubyspec/language/string_spec.rb:158:in `[]'
/home/mame/work/ruby/spec/rubyspec/language/string_spec.rb:158:in `block (2 levels) in <top (required)>'
/home/mame/work/ruby/spec/rubyspec/language/string_spec.rb:5:in `<top (required)>'
r25428 が原因です。このコミットでは、
- rdoc の文章が壊れています。
- rdoc によると、「to_s が override されて *いない* ときは to_s を使う」
という仕様だと思いますが、現在は to_s が override されて *いる* ときに
to_s を使うようになっていると思います。
$ ./ruby -ve '
class C
def to_s; "overridden"; end
end
p C.new
'
ruby 1.9.2dev (2010-01-26 trunk 26425) [i686-linux]
overridden
ということで、以下のパッチをコミットをしてもいいでしょうか。
このパッチによって上記の rubyspec のエラーが消えることを確認しています。
diff --git a/object.c b/object.c
index 73e5bd1..441f226 100644
--- a/object.c
+++ b/object.c
@@ -367,8 +367,6 @@ inspect_obj(VALUE obj, VALUE str, int recur)
* obj.inspect => string
*
* Returns a string containing a human-readable representation of
- * <i>obj</i>. If not overridden and no instance variables, uses the
- * <code>to_s</code> method to generate the string.
* <i>obj</i>. If not overridden, uses the <code>to_s</code> method to
* generate the string.
*
@@ -381,7 +379,7 @@ extern int rb_obj_basic_to_s_p(VALUE);
static VALUE
rb_obj_inspect(VALUE obj)
{
- if (TYPE(obj) == T_OBJECT && rb_obj_basic_to_s_p(obj)) {
+ if (TYPE(obj) == T_OBJECT && !rb_obj_basic_to_s_p(obj)) {
int has_ivar = 0;
VALUE *ptr = ROBJECT_IVPTR(obj);
long len = ROBJECT_NUMIV(obj);
--
Yusuke ENDOH <mame@tsg.ne.jp>
History
Updated by mame (Yusuke Endoh) over 2 years ago
2010年1月26日21:49 Tanaka Akira <akr@fsij.org>: > 2010年1月26日20:39 Yusuke Endoh <redmine@ruby-lang.org>: >> >> r25428 が原因です。このコミットでは、 >> >> - rdoc の文章が壊れています。 >> >> - rdoc によると、「to_s が override されて *いない* ときは to_s を使う」 >> という仕様だと思いますが、現在は to_s が override されて *いる* ときに >> to_s を使うようになっていると思います。 > > override されてる to_s は各クラスに特化したわかりやすい to_s だろうから > inspect としてはそっちを使うっていう話なんじゃないですか。 > > それに、override されていないときに to_s を使うっていうなら、 > メソッド呼び出しを通して dynamic binding にする意味はありませんよね。 確かに。そういうことなら、rdoc の間違いですかね。 diff --git a/object.c b/object.c index 73e5bd1..ab00efd 100644 --- a/object.c +++ b/object.c @@ -367,10 +367,8 @@ inspect_obj(VALUE obj, VALUE str, int recur) * obj.inspect => string * * Returns a string containing a human-readable representation of - * <i>obj</i>. If not overridden and no instance variables, uses the + * <i>obj</i>. If <code>to_s<\code> is overridden, uses the * <code>to_s</code> method to generate the string. - * <i>obj</i>. If not overridden, uses the <code>to_s</code> method to - * generate the string. * * [ 1, 2, 3..4, 'five' ].inspect #=> "[1, 2, 3..4, \"five\"]" * Time.new.inspect #=> "2008-03-08 19:43:39 +0900" 挙動は現状のままにするとして、 1. この挙動は 1.9.2 からの仕様変更 (1.9.1 はそのまま) 2. この挙動は 1.9 からの仕様変更 (1.9.1 にもバックポートする) 3. この挙動は 1.8/1.9 の仕様 (1.8.x にもバックポートする) のどれとすべきでしょうか。rubyspec の修正依頼の内容に影響します。 (1.8 の rb_obj_inspect の rdoc と挙動があってないので、1.8 にも なんらかの修正が必要だと思います。) -- Yusuke ENDOH <mame@tsg.ne.jp>
Updated by matz (Yukihiro Matsumoto) over 2 years ago
まつもと ゆきひろです
In message "Re: [Bug #2658] rubyspec: Ruby character strings interpolates the return value of Object#inspect, without ivars, if Object#to_s does not return a String instance ERROR"
on Tue, 26 Jan 2010 20:39:56 +0900, Yusuke Endoh <redmine@ruby-lang.org> writes:
|r25428 が原因です。このコミットでは、
|
|- rdoc の文章が壊れています。
|ということで、以下のパッチをコミットをしてもいいでしょうか。
|このパッチによって上記の rubyspec のエラーが消えることを確認しています。
コミットしてください。
Updated by matz (Yukihiro Matsumoto) over 2 years ago
まつもと ゆきひろです In message "Re: [ruby-dev:40164] Re: [Bug #2658] rubyspec: Ruby character strings interpolates the return value of Object#inspect, without ivars, if Object#to_s does not return a String instance ERROR" on Tue, 26 Jan 2010 22:41:55 +0900, Yusuke ENDOH <mame@tsg.ne.jp> writes: |> override されてる to_s は各クラスに特化したわかりやすい to_s だろうから |> inspect としてはそっちを使うっていう話なんじゃないですか。 |確かに。そういうことなら、rdoc の間違いですかね。 あー、そういうことか。間違ってるのはRDocの方ですね。 |挙動は現状のままにするとして、 | |1. この挙動は 1.9.2 からの仕様変更 (1.9.1 はそのまま) |2. この挙動は 1.9 からの仕様変更 (1.9.1 にもバックポートする) |3. この挙動は 1.8/1.9 の仕様 (1.8.x にもバックポートする) | |のどれとすべきでしょうか。rubyspec の修正依頼の内容に影響します。 1または2でしょうね。どちらにするかはYuguiさんにお任せします。
Updated by mame (Yusuke Endoh) over 2 years ago
- Assignee changed from matz (Yukihiro Matsumoto) to yugui (Yuki Sonoda)
Updated by yugui (Yuki Sonoda) over 2 years ago
On 1/27/10 6:29 PM, Yukihiro Matsumoto wrote:
> |挙動は現状のままにするとして、
> |
> |1. この挙動は 1.9.2 からの仕様変更 (1.9.1 はそのまま)
> |2. この挙動は 1.9 からの仕様変更 (1.9.1 にもバックポートする)
> |3. この挙動は 1.8/1.9 の仕様 (1.8.x にもバックポートする)
> |
> |のどれとすべきでしょうか。rubyspec の修正依頼の内容に影響します。
>
> 1または2でしょうね。どちらにするかはYuguiさんにお任せします。
1にします。そしてrubyspecを添付のpatchのように変更することを提案します。
理由としては
* 1.8や1.9.1の挙動を今更意味なく変えるのは反対です。
* 1.9.2のポリシーは、それはそれで肯けるので、ならば挙動は維持してrdocを
合わせましょう。
* inspectが何を表示するかは実装依存であるべきです。rb_any_to_s、つまり
デフォルトのto_sとも独立であるべきです。
* 当該のspecはrb_any_to_sとinspectを混同しています。
--
Yugui <yugui@yugui.jp>
http://yugui.jp
私は私をDumpする
From f86b412e1a52e2cd469abee2e8bad1a7627befe8 Mon Sep 17 00:00:00 2001
From: Yuki Sonoda (Yugui) <yugui@yugui.jp>
Date: Sat, 30 Jan 2010 12:34:02 +0900
Subject: [PATCH] The spec for interporation when Object#to_s did not return a String
was confusing the default representation of an arbitrary object and
Object#inspect.
---
language/string_spec.rb | 7 ++++---
1 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/language/string_spec.rb b/language/string_spec.rb
index c168e53..5a469ce 100644
--- a/language/string_spec.rb
+++ b/language/string_spec.rb
@@ -150,12 +150,13 @@ HERE
"#{obj}".should == '42'
end
- it "interpolates the return value of Object#inspect, without ivars, if Object#to_s does not return a String instance" do
+ it "interpolates an implementation depended representation of an object if the object does not return a String for #to_s and the representation of the object is not empty" do
obj = mock('to_s')
obj.stub!(:to_s).and_return(42)
- s = "#{obj}"[0..-2]
- s.should == obj.inspect[0, s.size]
+ s = nil
+ lambda { s = "#{obj}" }.should_not raise_error
+ s.should_not be_empty
end
ruby_version_is '1.9' do
--
1.6.3.1
Updated by mame (Yusuke Endoh) over 2 years ago
遠藤です。 2010年1月30日13:52 Yugui (Yuki Sonoda) <yugui@yugui.jp>: > On 1/27/10 6:29 PM, Yukihiro Matsumoto wrote: >> |挙動は現状のままにするとして、 >> | >> |1. この挙動は 1.9.2 からの仕様変更 (1.9.1 はそのまま) >> |2. この挙動は 1.9 からの仕様変更 (1.9.1 にもバックポートする) >> |3. この挙動は 1.8/1.9 の仕様 (1.8.x にもバックポートする) >> | >> |のどれとすべきでしょうか。rubyspec の修正依頼の内容に影響します。 >> >> 1または2でしょうね。どちらにするかはYuguiさんにお任せします。 > > 1にします。そしてrubyspecを添付のpatchのように変更することを提案します。 ありがとうございます。そして patch に賛成します。 > 理由としては > * 1.8や1.9.1の挙動を今更意味なく変えるのは反対です。 > * 1.9.2のポリシーは、それはそれで肯けるので、ならば挙動は維持してrdocを > 合わせましょう。 1.9.2 からの仕様変更というのに多少抵抗はありますが、了解です。 > * inspectが何を表示するかは実装依存であるべきです。rb_any_to_s、つまり > デフォルトのto_sとも独立であるべきです。 > * 当該のspecはrb_any_to_sとinspectを混同しています。 混同というか、rdoc を無視して rb_obj_inspect の実装をまるごと spec に したんでしょうね。 inspect はほかにもそこらじゅうで spec にされてしまっているので、いずれ 直さないと、と思います。 human-readable representation というのは機械判定できないけれど、 - ASCII-8BIT 以外のエンコーディングで、valid_encoding? が true になる くらいは仕様にしてもいい気がする。 -- Yusuke ENDOH <mame@tsg.ne.jp>
Updated by mame (Yusuke Endoh) over 2 years ago
Yugui さん 遠藤です。 2010年1月30日20:36 Yusuke ENDOH <mame@tsg.ne.jp>: > 2010年1月30日13:52 Yugui (Yuki Sonoda) <yugui@yugui.jp>: >> On 1/27/10 6:29 PM, Yukihiro Matsumoto wrote: >>> |挙動は現状のままにするとして、 >>> | >>> |1. この挙動は 1.9.2 からの仕様変更 (1.9.1 はそのまま) >>> |2. この挙動は 1.9 からの仕様変更 (1.9.1 にもバックポートする) >>> |3. この挙動は 1.8/1.9 の仕様 (1.8.x にもバックポートする) >>> | >>> |のどれとすべきでしょうか。rubyspec の修正依頼の内容に影響します。 >>> >>> 1または2でしょうね。どちらにするかはYuguiさんにお任せします。 >> >> 1にします。そしてrubyspecを添付のpatchのように変更することを提案します。 > > ありがとうございます。そして patch に賛成します。 このパッチを commit + push していただけますか? お忙しいようなら、許可さえもらえれば私がやってもいいです。 -- Yusuke ENDOH <mame@tsg.ne.jp>
Updated by mame (Yusuke Endoh) over 2 years ago
遠藤です。 2010年2月9日21:42 Yusuke ENDOH <mame@tsg.ne.jp>: > このパッチを commit + push していただけますか? > お忙しいようなら、許可さえもらえれば私がやってもいいです。 IRC で許可していただいたので、コミットしました。 -- Yusuke ENDOH <mame@tsg.ne.jp>
Updated by yugui (Yuki Sonoda) about 2 years ago
- Status changed from Open to Closed