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
einspect
? - ¿Y cuál es la diferencia entre
puts
,print
yp
?
Si hago un comentario sobre la función to_s
o inspect
, obtengo lo siguiente.
#<Graph:0x100124b88>
#<Graph:0x100124b88>
Consulte el siguiente enlace para obtener más información y ejemplos que explican la diferencia entre "to_s" e "inspect", así como la diferencia entre "puts" y "p". https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/45-more-classes/lessons/108-displaying-objects
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 objetoclass 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