62 votes

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

Pourquoi cette Ruby objet de deux to_s et d'inspecter les méthodes qui font la même chose? Ou, de sorte qu'il semble.

L' p des appels inspect, et met/impression des appels to_s pour la représentation de son 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 reçois

G
Graph : 0
Graph : 0
  • Alors, pourquoi ne Rubis ont deux fonctions faire la même chose? Ce qui fait la différence entre to_s et inspect?
  • Et quelle est la différence entre puts, print, et p?

Si j'en commentaire l' to_s ou inspect de la fonction, je reçois comme suit.

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

51voto

David Points 3766

inspect est utilisé davantage pour le débogage et to_s pour l'utilisateur final ou l'affichage.

Par exemple, [1,2,3].to_s et [1,2,3].inspect produisent différents résultats.

32voto

Mark Rushakoff Points 97350

inspect est une méthode qui, par défaut, vous indique le nom de la classe, l'instance de l' object_id, et les listes d'arrêt de l'instance des variables d'instance.

print et puts sont utilisés, comme vous le savez déjà, mettre la valeur de l'objet de l' to_s méthode de STDOUT. Comme indiqué par les Rubis de la documentation, Object#to_s retourne une chaîne de caractères représentant l'objet-utilisée pour l'utilisateur final des raisons de lisibilité.

print et puts sont identiques les uns aux autres, sauf pour puts ajoute automatiquement un saut de ligne, alors que print ne le sont pas.

14voto

grokus Points 1818

Pour comparer avec Python, to_s est similaire à __str__ et inspect est équivalente à __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.

5voto

RobH Points 408

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 seulement 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.) Je pense que je devrais le mentionner parce que je l'ai déjà été mordu :)

1voto

Feuda Points 88
 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 
 

Du tutoriel Rails

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X