objetos modulos manejo lista herencia clases ruby object printing

modulos - ¿Por qué este objeto Ruby tiene ambas cosas e inspecciona métodos que parecen hacer lo mismo?



modulo ruby (9)

Además, hay un método to_str en ciertos objetos, al que llamarías cuando necesites un objeto tipo String, y no solo una representación de cadena. (Pruebe en IRB: [1,2,3].to_str y fallará, pero [1,2,3].to_s no lo hará.) Siento que debería mencionar esto porque me ha mordido antes :)

¿Por qué Ruby objeta tanto to_s como inspect métodos que parecen hacer lo mismo?

El método p llama a inspect y pone / imprime llamadas to_s para representar el objeto.

Si corro

class Graph def initialize @nodeArray = Array.new @wireArray = Array.new end def to_s # called with print / puts "Graph : #{@nodeArray.size}" end def inspect # called with p "G" end end if __FILE__ == $0 gr = Graph.new p gr print gr puts gr end

yo obtengo

G Graph : 0 Graph : 0

  • Entonces, ¿por qué Ruby tiene dos funciones para hacer lo mismo? ¿Cuál es la diferencia entre to_s e inspect ?
  • ¿Y cuál es la diferencia entre puts , print y p ?

Si hago un comentario sobre la función to_s o inspect , obtengo lo siguiente.

#<Graph:0x100124b88> #<Graph:0x100124b88>



Para comparar con Python, to_s es como __str__ e inspect es como __repr__ . to_s te da una cadena, mientras que inspect te da la representación de cadena del objeto. Puedes usar este último para construir un objeto si lo deseas.


Para cualquiera que llegue aquí después de comenzar con Ruby Koans , un ejemplo simple de dónde to_s e inspect difieren en el resultado es este:

nil.to_s # will yield an empty string, ie "" nil.inspect # will yield the string "nil"


Respuesta del libro Learn to Program de Chris Pine

"El método de inspección es muy parecido a to_s, excepto que la cadena que retorna intenta mostrarle el código ruby ​​para construir el objeto que lo pasó".

Por lo tanto, el método de inspección devolverá una matriz, por ejemplo, así ...

[25, 16, 9, 4, 1, 0]

Donde volverá put / to_s

25 16 9 4 1 0


inspect es un método que, de forma predeterminada, le dice el nombre de la clase, el object_id la instancia y enumera las variables de instancia de la instancia.

print y puts se usan, como ya sabes, para poner el valor del método to_s del objeto en STDOUT . Como se indica en la documentación de Ruby, Object#to_s devuelve una cadena que representa el objeto, que se utiliza para la legibilidad del usuario final.

print y puts son idénticos entre sí, excepto para que puts agregue automáticamente una nueva línea, mientras que la print no.


inspect se usa más para la depuración y to_s para el usuario final o con fines de visualización.

Por ejemplo, [1,2,3].to_s y [1,2,3].inspect producen resultados diferentes.


puts generalmente imprime el resultado de aplicar to_s en un objeto, mientras que p imprime el resultado de inspect el objeto.

Hay una diferencia sutil entre inspect y to_s :

  • inspect , cuando se aplica sobre un objeto, devuelve el código hexadecimal del objeto junto con la variable de instancia
  • to_s , cuando se aplica a un objeto, devuelve solo el código hexadecimal del objeto

    class Item def initialize(abc) @abc=abc end end x= Item.new(22) puts x #prints object x hex code puts x.inspect #prints object x hex code WITH INSTANCE VARIABLE @abc puts x.to_s #prints object x hex code p x #prints object x hex code WITH INSTANCE VARIABLE @abc p x.inspect #prints object x hex code WITH INSTANCE VARIABLE @abc p x.to_s #prints object x hex code


2.0.0p195 :075 > puts (1..5).to_a # Put an array as a string. 1 2 3 4 5 => nil 2.0.0p195 :076 > puts (1..5).to_a.inspect # Put a literal array. [1, 2, 3, 4, 5] => nil 2.0.0p195 :077 > puts :name, :name.inspect name :name => nil 2.0.0p195 :078 > puts "It worked!", "It worked!".inspect It worked! "It worked!" => nil 2.0.0p195 :079 > p :name # Same as ''puts :name.inspect'' :name => :name

Del tutorial Rails