o = Object.new
o.instance_eval { @str = "foo" }
p o # => #<Object:0x5dd1a0 @foo="bar">
Esto es bueno. Llamar a p
con un objeto como argumento imprime el resultado del método de los objetos inspect
. Pero, por desgracia, si el objeto tiene un método to_s
anulado entonces será salida de la salida de ese:Emular objeto predeterminado # inspeccionar Salida?
class << o
def to_s; @str; end
end
p o.to_s # => "foo"
p o # => foo
Así que para solucionar este problema, tenemos que definir un método inspect
en nuestro objetivo:
class << o
def inspect; "blah"; end
end
p o # => "blah"
¿Cómo puedo hacer que el método inspect
de mi objeto muestre la forma predeterminada de Ruby como se muestra en la línea 3 del primer ejemplo de código?
El más cercano que tengo es el siguiente, pero no estoy seguro si es del todo bien
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
¿Qué versión de Ruby estás usando? –