web-dev-qa-db-fra.com

Pourquoi cet objet Ruby a-t-il à la fois des méthodes to_s et inspect qui semblent faire la même chose?

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
  • Alors, pourquoi Ruby a-t-il deux fonctions qui font la même chose? Quelle est la différence entre to_s et inspect?
  • Et quelle est la différence entre puts, print et p?

Si je commente la fonction to_s ou inspect, le résultat est le suivant.

#<Graph:0x100124b88>
#<Graph:0x100124b88>
58
prosseek

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.

48
David

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.

31
Mark Rushakoff

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.

13
grokus

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 :)

5
RobH

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 inspecting 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
3
pintua

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"
3
Greg Matthew Crossley

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
1
codebreeze
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

1
Feuda

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

0
Gitanjali