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.

Réponses:


421

Peut-être:

puts variable.inspect

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"]

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


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.


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(":")}

10

met foo.to_json

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


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

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


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", "tom@tom.com", 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] 

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.