2008-12-09 2 views

Répondre

327

Peut-être:

puts variable.inspect 
+13

Ajout d'une méthode [ 'inspect'] (http://www.ruby-doc.org/ruby-1.9/classes/Object.html#M000225) à votre classe vous permet de définir comment les attributs de la classe sont affichés, plutôt que de s'appuyer sur la sortie par défaut. Beaucoup de classes ne l'implémentent pas bien, mais cela peut être très utile lors du débogage. Ruby retournera à 'to_s' s'il ne trouve pas de méthode inspect'. –

+4

Le lien actuel est brisé, Voir celui-ci http://ruby-doc.org/core-2.0/Object.html#method-i-inspect – SamFlushing

+4

'server = TCPServer.new 0; met server.inspect # => nil '. cela ne fonctionnera pas pour les objets les plus complexes. – ribamar

49

Vous pourriez trouver une utilisation pour la méthode methods qui retourne un tableau de méthodes d'un objet. Ce n'est pas la même chose que print_r, mais toujours utile à certains moments.

>> "Hello".methods.sort 
=> ["%", "*", "+", "<", "<<", "<=", "<=>", "==", "===", "=~", ">", ">=", "[]", "[]=", "__id__", "__send__", "all?", "any?", "between?", "capitalize", "capitalize!", "casecmp", "center", "chomp", "chomp!", "chop", "chop!", "class", "clone", "collect", "concat", "count", "crypt", "delete", "delete!", "detect", "display", "downcase", "downcase!", "dump", "dup", "each", "each_byte", "each_line", "each_with_index", "empty?", "entries", "eql?", "equal?", "extend", "find", "find_all", "freeze", "frozen?", "grep", "gsub", "gsub!", "hash", "hex", "id", "include?", "index", "inject", "insert", "inspect", "instance_eval", "instance_of?", "instance_variable_defined?", "instance_variable_get", "instance_variable_set", "instance_variables", "intern", "is_a?", "is_binary_data?", "is_complex_yaml?", "kind_of?", "length", "ljust", "lstrip", "lstrip!", "map", "match", "max", "member?", "method", "methods", "min", "next", "next!", "nil?", "object_id", "oct", "partition", "private_methods", "protected_methods", "public_methods", "reject", "replace", "respond_to?", "reverse", "reverse!", "rindex", "rjust", "rstrip", "rstrip!", "scan", "select", "send", "singleton_methods", "size", "slice", "slice!", "sort", "sort_by", "split", "squeeze", "squeeze!", "strip", "strip!", "sub", "sub!", "succ", "succ!", "sum", "swapcase", "swapcase!", "taguri", "taguri=", "taint", "tainted?", "to_a", "to_f", "to_i", "to_s", "to_str", "to_sym", "to_yaml", "to_yaml_properties", "to_yaml_style", "tr", "tr!", "tr_s", "tr_s!", "type", "unpack", "untaint", "upcase", "upcase!", "upto", "zip"] 
+0

La moitié de ce que je cherchais, merci! – roryf

+9

Utiliser l'introspection fait partie du plaisir de Ruby. Il est souvent utile de soustraire 'instance_methods' d'un objet de la classe 'en question pour obtenir les méthodes qui sont uniques:' (String.instance_methods - Object.instance_methods) .sort' –

+2

cela devrait être la bonne réponse car je m'attendais à cela quand trouver cette page. – jaycode

28
p object 

Ruby doc for p.

p(*args) public

Pour chaque objet, directement suivi obj.inspect écrit par une nouvelle ligne de sortie standard du programme.

+0

N'est-ce pas la même chose que variable.to_s? J'ai trouvé que juste affiche une référence d'objet à moins que la classe l'écrase explicitement – roryf

+1

p est aussi un alias pour les puts – dylanfm

+20

non, 'p object' signifie' puts object.inspect' – rampion

42

La méthode to_yaml semble parfois être utile:

$foo = {:name => "Clem", :age => 43} 

puts $foo.to_yaml 

retours

--- 
:age: 43 
:name: Clem 

(Est-ce que cela dépend de certains modules YAML en cours de chargement ou serait-ce généralement disponible?)

+3

Oui, 'to_yaml' nécessite que le modèle YAML soit chargé. Il fait partie de la bibliothèque standard de Ruby, cependant. – Chuck

+0

cela a été utile lorsque j'essayais d'inspecter un objet Amazon S3 dans une console d'application Rails. – Paul

9

met foo.to_json

pourrait être utile car le module JSON est chargé par défaut

+3

'to_json' n'est pas chargé par défaut dans 1.8.7 ou 1.9.2. –

12

Si vous cherchez seulement les variables d'instance dans l'objet, cela pourrait être utile:

obj.instance_variables.map do |var| 
    puts [var, obj.instance_variable_get(var)].join(":") 
end 

ou comme une doublure pour copier et coller:

obj.instance_variables.map{|var| puts [var, obj.instance_variable_get(var)].join(":")} 
-1
object.attributes_name 

=> [ "id", "name", "email", "created_at", "updated_at", "password_digest", "remember_token", "admin", "marketing_permission s », "Termes_et_conditions", "désactiver", "Black_list", "zero_cost", "password_reset_token", "password_reset_sent_at"]

object.attributes.values 

=> [1, "tom", "[email protected]" , Mar., 02 juin 2015 00:16:03 UTC +00: 00, mar., 02 juin 2015 00:22:35 UTC +00: 00, "$ 2a $ 10 $ gUTr3lpHzXvCDhVvizo8Gu/MxiTrazOWmOQqJXMW8gFLvwDftF9Lm", "2dd1829c9fb3af2a36a970acda0efe5c1d471199", vrai, néant , nul, nul, nul, nul, nul, nul]

+3

'méthode undefined 'attributs' pour ...' – yegor256

+1

'object.attributes_name' ne fonctionnait pas, mais' object.attributes' ne permet pas d'obtenir un bon hachage de clés et de valeurs. Cela m'a aidé, merci! – d3vkit

+0

En fait, la bonne est 'attribute_names' –

3

Si vous voulez imprimer une déjà JSON dentelée:

require 'json' 
... 
puts JSON.pretty_generate(JSON.parse(object.to_json)) 
2

Je suis tombé sur ce fil parce que je cherchais quelque chose de similaire. J'aime les réponses et ils m'ont donné quelques idées alors j'ai testé le.méthode to_hash et a très bien fonctionné pour le cas d'utilisation aussi. soo:

object.to_hash