Pourquoi cette Ruby objet à la fois to_s et d'inspecter les méthodes qui semblent faire la même chose?
Pourquoi cette Ruby objet à la fois un to_s
et inspect
méthodes qui semblent faire la même chose?
La p
les appels de méthode inspect
et met/imprimer appels to_s
pour la représentation de l'objet.
Si je lance
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 obtenir
G
Graph : 0
Graph : 0
- Alors, pourquoi ne Rubis ont deux fonctions faire la même chose? Quelle est la différence entre
to_s
etinspect
? - Et quelle est la différence entre
puts
,print
, etp
?
Si j'commentaire la to_s
ou inspect
fonction, je reçois comme suit.
#<Graph:0x100124b88>
#<Graph:0x100124b88>
Vous devez vous connecter pour publier un commentaire.
inspect
est plus utilisé pour le débogage etto_s
pour l'utilisateur final ou à des fins d'affichage.Par exemple,
[1,2,3].to_s
et[1,2,3].inspect
produire de sortie différents."[1, 2, 3]"
. D'autre part,nil.to_s
etnil.inspect
produit""
et"nil"
respectivement.[1,2,3].to_s => "123"
;[1,2,3].inspect => "[1, 2, 3]"
."#{...}"
utilise l'ancien;p ...
utilise ce dernier.[1,2,3].to_s => "123"
. Avec ruby 2.0.0-je obtenir[1,2,3].to_s => "[1, 2, 3]"
. Donc, l'exemple donné est soit vrai ou pas vrai selon la version que vous parlez./a/.inspect
donne/a/
qui est lisible par l'homme, mais/a/.to_s
donne(?-mix:a)
.Array#to_s
êtreArray#inspect
. stackoverflow.com/q/3960392inspect
est une méthode qui, par défaut, vous indique le nom de la classe, de l'instanceobject_id
, et énumère hors de l'instance des variables d'instance.print
etputs
sont utilisés, comme vous le savez déjà, mettre la valeur de l'objet duto_s
méthode pourSTDOUT
. Comme indiqué par les Rubis de la documentation,Objet#to_s
retourne une chaîne de caractères représentant l'objet-utilisée pour l'utilisateur final des raisons de lisibilité.print
etputs
sont identiques les uns aux autres, sauf pourputs
ajoute automatiquement un saut de ligne, alors queprint
ne pas.Time.new.inspect
ne donne pas l'class
nom etobject_id
, elle a plutôt des impressions"2016-11-10 13:05:45 +0530"
(de Temps enstring
)À comparer avec Python,
to_s
est comme__str__
etinspect
est comme__repr__
.to_s
vous donne une chaîne de caractères, alors queinspect
vous donne la représentation de chaîne de l'objet. Vous pouvez utiliser ce dernier pour construire un objet si vous le souhaitez.eval(repr(z)) == z
doit être Vrai: comment obtenir ce résultat en Ruby?eval(repr(z)) == z
est un mythe. C'est très rarement une chose utile à faire, et il y a beaucoup de problèmes potentiels. Cet article est un bon début: stupidpythonideas.blogspot.com.au/2013/11/...__repr__
s de travail comme ça, pour très peu d'avantages pratiques.De plus, il est
to_str
méthode, de certains objets, qui que vous appelez lorsque vous avez besoin d'une Chaîne, comme objet, et non pas seulement une représentation de chaîne. (Essayez de RIR:[1,2,3].to_str
et ce sera un échec, mais[1,2,3].to_s
ne sera pas.) Je pense que je devrais le mentionner parce que j'ai été mordu par avant 🙂to_s
est conçu pour la représentation de chaîne et, comme telle, est utilisé sur l'interpolation, alors queto_str
est destinée pour les conversions implicites tels que le type encore de la contrainte.Pour toute personne arrivant ici, après des débuts avec Ruby Koans, un exemple simple d'où
to_s
etinspect
diffèrent en sortie est: est-ceputs
généralement imprime le résultat de l'application deto_s
sur un objet, tandis quep
imprime le résultat deinspect
ing de l'objet.Il y a une différence subtile entre
inspect
etto_s
:inspect
, lorsqu'il est appliqué sur un objet, renvoie l'objet code hexadécimalavec la variable d'instance
to_s
, lorsqu'il est appliqué sur un objet,renvoie uniquement l'objet en code hexDe la Rails De Tutoriel
Réponse de Chris Pine Apprendre À programmer livre
"La méthode examiner est un peu comme to_s, sauf que la chaîne elle renvoie tente de vous montrer le code ruby pour la construction de l'objet que vous avez réussi."
Ainsi, la méthode examiner retournera un tableau, par exemple comme ceci...
Où, comme le met /to_s sera de retour
Référer lien suivant pour plus d'informations et des exemples expliquant la différence entre "to_s" et "inspecter" ainsi que de la différence entre le "met" et "p".
https://rubymonk.com/learning/books/4-ruby-primer-ascent/chapters/45-more-classes/lessons/108-displaying-objects