Bug #4453
closedOverriding #to_s changes #inspect
Description
My Ruby is: ruby 1.9.2p180 (2011-02-18) [i386-mingw32]¶
sample codes 1:¶
class Foo # subclass of Object, inherits #inspect and #to_s
def initialize(bar,baz)
@bar, @baz = bar, baz
end
end
obj = Foo.new(:cat, :dog)
puts "\n== #inspect ====="
p obj #<Foo:0xb44398 @bar=:cat, @baz=:dog>
puts obj.inspect #<Foo:0xb44398 @bar=:cat, @baz=:dog>
printf "%p", obj #<Foo:0xb44398 @bar=:cat, @baz=:dog>
puts "\n== #to_s ========"
puts obj.to_s #Foo:0xb44398
printf "%s", obj #Foo:0xb44398
Yes, #inspect and #to_s are not synonyms, they return different strings.¶
sample codes 2, add 'def to_s':¶
class Foo
def initialize(bar,baz)
@bar, @baz = bar, baz
end
def to_s # override #to_s method
"has @bar = #{@bar}, @baz = #{@baz}."
end
end
obj = Foo.new(:cat, :dog)
puts "\n== #inspect ====="
p obj # has @bar = cat, @baz = dog.
puts obj.inspect # has @bar = cat, @baz = dog.
printf "%p", obj # has @bar = cat, @baz = dog.
puts "\n== #to_s ========"
puts obj.to_s # has @bar = cat, @baz = dog.
printf "%s", obj # has @bar = cat, @baz = dog.
However, overriding #to_s makes #inspect do the identical thing. I don't think it's perfect.¶
In fact, the problem was reported in 2009. http://redmine.ruby-lang.org/issues/1786
At the bottom of the page, Matz said:¶
"Redefining #to_s should not affect inspect, if they are totally different."¶
I agree with Matz. #to_s and #inspcet should not be synonyms:¶
#to_s maybe for the user of the application, they want a readable message;¶
but #inspect maybe for the programmer, they want a debug information.¶
So, if this is a bug, maybe it should be fixed. If it's a feature in 1.9.2, I think it's not a good one,¶
because I lose a quick and convenient debug method to know an object's class the its instance variables.¶
I may want to show something readable to user of my app, as well as something usable for myself.¶
The feature (or bug) doesn't satisfy both.¶
Files
Updated by yimutang (Joey Zhou) over 13 years ago
=begin
My Ruby is: ruby 1.9.2p180 (2011-02-18) [i386-mingw32]
sample codes 1:
class Foo # subclass of Object, inherits #inspect and #to_s
def initialize(bar,baz)
@bar, @baz = bar, baz
end
end
obj = Foo.new(:cat, :dog)
puts "\n== #inspect ====="
p obj #<Foo:0xb44398 @bar=:cat, @baz=:dog>
puts obj.inspect #<Foo:0xb44398 @bar=:cat, @baz=:dog>
printf "%p", obj #<Foo:0xb44398 @bar=:cat, @baz=:dog>
puts "\n== #to_s ========"
puts obj.to_s #Foo:0xb44398
printf "%s", obj #Foo:0xb44398
Yes, #inspect and #to_s are not synonyms, they return different strings.
sample codes 2, add 'def to_s':
class Foo
def initialize(bar,baz)
@bar, @baz = bar, baz
end
def to_s # override #to_s method
"has @bar = #{@bar}, @baz = #{@baz}."
end
end
obj = Foo.new(:cat, :dog)
puts "\n== #inspect ====="
p obj # has @bar = cat, @baz = dog.
puts obj.inspect # has @bar = cat, @baz = dog.
printf "%p", obj # has @bar = cat, @baz = dog.
puts "\n== #to_s ========"
puts obj.to_s # has @bar = cat, @baz = dog.
printf "%s", obj # has @bar = cat, @baz = dog.
However, overriding #to_s makes #inspect do the identical thing. I don't think it's perfect.
In fact, the problem was reported in 2009. http://redmine.ruby-lang.org/issues/1786
At the bottom of the page, Matz said:
"Redefining #to_s should not affect inspect, if they are totally different."
I agree with Matz. #to_s and #inspcet should not be synonyms:
#to_s maybe for the user of the application, they want a readable message;
but #inspect maybe for the programmer, they want a debug information.
So, if this is a bug, maybe it should be fixed. If it's a feature in 1.9.2, I think it's not a good one,
because I lose a quick and convenient debug method to know an object's class the its instance variables.
I may want to show something readable to user of my app, as well as something usable for myself.
The feature (or bug) doesn't satisfy both.
=end
Updated by yimutang (Joey Zhou) over 13 years ago
- File to_s_and_inspect.txt to_s_and_inspect.txt added
=begin
I'm so sorry! I copy the report from my notepad. I don't know why the text formatting get so messy.
so I upload the report txt...
=end
Updated by naruse (Yui NARUSE) over 13 years ago
- Status changed from Open to Assigned
- Assignee set to matz (Yukihiro Matsumoto)
=begin
=end
Updated by qwerty55 (salvatore giudice) over 12 years ago
Is there some reason that this bug persists for years? Every time I'm debugging a new ruby programmer's code, I run into this. Rookies love to override to_s for some odd reason. When inspect and pp break on to_s, it makes me see flames and hear the screaming children again.
Updated by naruse (Yui NARUSE) over 12 years ago
qwerty55 (salvatore giudice) wrote:
Is there some reason that this bug persists for years?
Because you didn't report it.
You should thank yimutang.
Updated by mame (Yusuke Endoh) over 12 years ago
- Assignee changed from matz (Yukihiro Matsumoto) to mame (Yusuke Endoh)
A feature ticket #6130 duplicates this ticket.
And matz accepted #6130. So this will be "fixed" in 2.0
To prevent a discussion log from being scattered, please
don't reply to this ticket any more.
--
Yusuke Endoh mame@tsg.ne.jp
Updated by mame (Yusuke Endoh) almost 12 years ago
- Status changed from Assigned to Closed
"Fixed" at r36699. See #6130.
--
Yusuke Endoh mame@tsg.ne.jp