Эмулировать объект по умолчанию # проверить вывод?

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
9
задан RyanScottLewis 24 April 2011 в 15:19
поделиться