Здесь решение Александера, первая буква p должна дать переопределенный to_s, но нет, вы должны явно вызвать to_s, как во второй букве p, чтобы получить желаемый результат.Я также не уверен, что эта проверка даст тот же результат, что и оригинал с более сложными объектами, я попробую это дома.Кто-нибудь еще лучше выстрелил?Я знаю о драгоценном камне awesome_print, но ИМХО для чего-то базового вам не нужно включать драгоценные камни.
class Person
def initialize(first=nil, last=nil, birthdate=nil)
@first, @last, @birthdate = first, last, birthdate
end
# New implementation of to_s
def to_s
"#{@first} #{@last}"
end
def inspect
vars = self.instance_variables.
map{|v| "#{v}=#{instance_variable_get(v).inspect}"}.join(", ")
"<#{self.class}: #{vars}>"
end
end
me = Person.new("John")
p me #--><Person: @first="John", @last=nil, @birthdate=nil>
p me.to_s #-->"John "
p me.inspect #-->"<Person: @first=\"John\", @last=nil, @birthdate=nil>"
Редактировать: я только что попробовал awesome_print и мне приятно, я боялся, что должениспользовать IRB, чтобы использовать его, но это не так, я запускаю свои скрипты в своем редакторе, а именно:
require 'awesome_print'
ap me -->
#<Person:0x027efe20
@birthdate = nil,
@first = "John",
@last = nil
>
Редактировать, используя pretty_print, как предложено Александром, не мешает переопределенным to_s
require 'PP'
class Person
def initialize(first=nil, last=nil, birthdate=nil)
@first, @last, @birthdate = first, last, birthdate
end
# New implementation of to_s
def to_s
"#{@first} #{@last}"
end
end
me = Person.new("John")
pp me #--> <Person: @first="John", @last=nil, @birthdate=nil>
warn me.pretty_inspect #--> <Person: @first="John", @last=nil, @birthdate=nil>