Pourquoi cet objet Ruby est-il une méthode to_s
et inspect
qui semblent faire la même chose?
La méthode p
appelle inspect
et place/imprime les appels to_s
pour représenter l'objet.
Si je cours
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
Je reçois
G
Graph : 0
Graph : 0
to_s
et inspect
?puts
, print
et p
?Si je commente la fonction to_s
ou inspect
, le résultat est le suivant.
#<Graph:0x100124b88>
#<Graph:0x100124b88>
inspect
est davantage utilisé pour le débogage et to_s
pour l'utilisateur final ou pour l'affichage.
Par exemple, [1,2,3].to_s
et [1,2,3].inspect
produisent une sortie différente.
inspect
est une méthode qui, par défaut, vous indique le nom de la classe, le object_id
de l'instance et répertorie les variables d'instance de l'instance.
print
et puts
servent, comme vous le savez déjà, à mettre la valeur de la méthode to_s
de l'objet à STDOUT
. Comme indiqué dans la documentation de Ruby, Object#to_s
renvoie une chaîne représentant l'objet, utilisée pour la lisibilité de l'utilisateur final.
print
et puts
sont identiques, sauf que puts
ajoute automatiquement une nouvelle ligne, alors que print
ne l’a pas.
Pour comparer avec Python, to_s
est comme __str__
et inspect
est comme __repr__
. to_s
vous donne une chaîne, alors que inspect
vous donne la représentation sous forme de chaîne de l'objet. Vous pouvez utiliser ce dernier pour construire un objet si vous le souhaitez.
En outre, il existe une méthode to_str
sur certains objets, que vous appelez lorsque vous avez besoin d'un objet de type chaîne, et pas uniquement d'une représentation sous forme de chaîne. (Essayez dans IRB: [1,2,3].to_str
et cela échouera, mais [1,2,3].to_s
ne le fera pas.) J’ai le sentiment que je devrais le mentionner parce que j’ai déjà été mordu auparavant :)
puts
imprime généralement le résultat de l'application de to_s
sur un objet, tandis que p
imprime le résultat de inspect
ing de l'objet.
Il existe une différence subtile entre inspect
et to_s
:
inspect
, lorsqu'il est appliqué à un objet, renvoie le code hexadécimal de l'objet .__ ainsi que la variable d'instance. to_s
, lorsqu'il est appliqué à un objet, renvoie uniquement le code hexadécimal de l'objet
classe Item def initialize (abc) @ abc = abc end end x = Item.new (22) met x #prints objet x code hexadécimal met x.inspect #prints objet x code hexadécimal WITH INSTANCE VARIABLE @ abc met x.to_s #prints objet x code hexadécimal px #prints objet x code hexadécimal AVEC INSTANCE VARIABLE @abc p x.inspect #prints objet x code hexadécimal AVEC INSTANCE VARIABLE @abc p x.to_s #prints object x code hexadécimal
Pour ceux qui arrivent ici après avoir commencé avec Ruby Koans , voici un exemple simple où to_s
et inspect
diffèrent:
nil.to_s # will yield an empty string, ie ""
nil.inspect # will yield the string "nil"
Réponse de Chris Pine au livre de programme Learn To
"La méthode inspect ressemble beaucoup à to_s, sauf que la chaîne renvoyée tente de vous montrer le code Ruby permettant de construire l'objet que vous lui avez transmis."
Ainsi, la méthode inspectera un tableau, par exemple, comme ceci ...
[25, 16, 9, 4, 1, 0]
Où reviendra comme met/to_s
25
16
9
4
1
0
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
Depuis le Tutoriel Rails
Reportez-vous au lien suivant pour plus d'informations et des exemples expliquant la différence entre "to_s" et "inspecter", ainsi que la différence entre "mettant" et "p" . https://rubymonk.com/learning/books/4- Ruby-primer-ascension/chapitres/45 classes-plus/leçons/108-display-objects