Comment vider les champs d'un objet dans la console?

265

Lorsque j'exécute un simple script Ruby, quelle est la façon la plus simple de vider les champs d'un objet sur la console?

Je cherche quelque chose de similaire à PHP print_r()qui fonctionnera également avec les tableaux.

roryf
la source

Réponses:

421

Peut-être:

puts variable.inspect
Christian Lescuyer
la source
15
L'ajout d'une inspectméthode à votre classe vous permet de définir la façon dont 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 reviendra to_ss'il ne trouve pas de méthode d'inspection.
The Tin Man
4
Le lien actuel est cassé, voir celui-ci ruby-doc.org/core-2.0/Object.html#method-i-inspect
SamFlushing
5
server = TCPServer.new 0 ; puts server.inspect #<TCPServer:fd 9> => nil . cela ne fonctionnera pas pour la plupart des objets complexes.
ribamar
Comme c'est la première réponse trouvée lors de la recherche d'un var_dumpéquivalent php en rubis, j'ai trouvé que cela ppétait très utile dans ce cas, regardez ici - stackoverflow.com/questions/6501506/ruby-inspect-readability/…
Rabin
Notez que p objectc'est un alias pourputs object.inspect
Jan Klimo
54

Vous pourriez trouver une utilisation pour la methodsméthode qui renvoie un tableau de méthodes pour un objet. Ce n'est pas la même chose print_r, mais c'est toujours utile parfois.

>> "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"]
dylanfm
la source
9
L'utilisation de l'introspection fait partie du plaisir de Ruby. Il est souvent utile de soustraire un objet instance_methodsde la classe en question pour obtenir les méthodes qui sont uniques:(String.instance_methods - Object.instance_methods).sort
le Tin Man
2
cela devrait être la bonne réponse car je m'y attendais en trouvant cette page.
jaycode
.methods.sortest très utile. Existe-t-il un moyen «intelligent» de montrer rapidement des méthodes qui sont (vaguement) uniques à cet objet particulier? Par exemple, une méthode comme celle-ci .to_speut apparaître souvent, ce n'est donc pas très utile, mais certaines peuvent être très utiles pour connaître certaines méthodes pour certains objets. Surtout dans les cas qui ne sont pas évidents. Existe-t-il un moyen de les obtenir rapidement? (cas d'espèce, j'ai un PG::Resultobjet, et je veux évaluer rapidement les méthodes probables que je pourrais éventuellement trouver utiles.
stevec
51

La to_yamlméthode semble parfois utile:

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

puts $foo.to_yaml

Retour

--- 
:age: 43
:name: Clem

(Est-ce que cela dépend du YAMLchargement d' un module? Ou est-ce généralement disponible?)

mjs
la source
3
Oui, to_yamlnécessite le chargement du modèle YAML. Il fait cependant partie de la bibliothèque standard de Ruby.
Chuck
cela a été utile lorsque j'essayais d'inspecter un objet Amazon S3 dans une console d'application Rails.
Paul
32
p object

Doc Ruby pour p.

p(*args) public

Pour chaque objet, écrit directement obj.inspect suivi d'un retour à la sortie standard du programme.

rampion
la source
N'est-ce pas la même chose que variable.to_s? J'ai trouvé que juste imprime une référence d'objet à moins que la classe ne la remplace explicitement
roryf
15

Si vous recherchez uniquement les variables d'instance dans l'objet, cela peut être utile:

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

ou en une ligne pour copier et coller:

obj.instance_variables.map{|var| puts [var, obj.instance_variable_get(var)].join(":")}
Mike
la source
10

met foo.to_json

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

tjerk
la source
4
to_jsonn'est pas chargé par défaut en 1.8.7 ou 1.9.2.
The Tin Man
5

Si vous souhaitez imprimer un JSON déjà en retrait :

require 'json'
...
puts JSON.pretty_generate(JSON.parse(object.to_json))
ROUMANIE_ingénieur
la source
5

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, j'ai donc testé la méthode .to_hash et j'ai très bien fonctionné pour le cas d'utilisation. soo:

object.to_hash

Gregor
la source
2
object.attribute_names

# => ["id", "name", "email", "created_at", "updated_at", "password_digest", "remember_token", "admin", "marketing_permissions", "terms_and_conditions", "disable", "black_list", "zero_cost", "password_reset_token", "password_reset_sent_at"]


object.attributes.values

# => [1, "tom", "[email protected]", Tue, 02 Jun 2015 00:16:03 UTC +00:00, Tue, 02 Jun 2015 00:22:35 UTC +00:00, "$2a$10$gUTr3lpHzXvCDhVvizo8Gu/MxiTrazOWmOQqJXMW8gFLvwDftF9Lm", "2dd1829c9fb3af2a36a970acda0efe5c1d471199", true, nil, nil, nil, nil, nil, nil, nil] 
Conor
la source
4
undefined method 'attributes' for ...
yegor256
3
object.attributes_namen'a pas fonctionné, mais object.attributespermet d'obtenir un bon hachage des clés et des valeurs. Cela m'a aidé, merci!
d3vkit