o = Object.new
o.instance_eval { @str = "foo" }
p o # => #<Object:0x5dd1a0 @foo="bar">
Это хорошо. Вызов p
с объектом в качестве аргумента распечатывает выходные данные метода объектов inspect
. Но, к сожалению, если у объекта есть переопределенный метод to_s
, то он выведет результат этого:
class << o
def to_s; @str; end
end
p o.to_s # => "foo"
p o # => foo
Итак, чтобы исправить это, мы должны определить метод inspect
в нашем объект:
class << o
def inspect; "blah"; end
end
p o # => "blah"
Как мне сделать так, чтобы метод моего объекта inspect
выводил метод Ruby по умолчанию, как показано в строке 3 моего первого примера кода?
Ближайший из имеющихся у меня - это ниже, но я не уверен, что это совершенно верно
class << o
def inspect
vars = instance_variables.collect { |v| v.to_s << "=#{instance_variable_get(v).inspect}"}.join(", ")
"#<#{self.class}:0x#{object_id} #{vars}>"
end
end