Come posso scaricare i campi di un oggetto sulla console?


265

Quando eseguo un semplice script Ruby, qual è il modo più semplice per scaricare i campi di un oggetto sulla console?

Sto cercando qualcosa di simile a PHP print_r()che funzioni anche con gli array.

Risposte:


421

Possibilmente:

puts variable.inspect

15
L'aggiunta di un inspectmetodo alla classe consente di definire la modalità di visualizzazione degli attributi della classe, anziché fare affidamento sull'output predefinito. Molte classi non lo implementano bene, ma può essere davvero utile durante il debug. Ruby tornerà indietro to_sse non riesce a trovare un metodo di ispezione.
l'Uomo di latta il

4
Il collegamento corrente è interrotto, vedi questo ruby-doc.org/core-2.0/Object.html#method-i-inspect
SamFlushing

5
server = TCPServer.new 0 ; puts server.inspect #<TCPServer:fd 9> => nil . non funzionerà per gli oggetti più complessi.
Ribamar,

Dato che questa è la prima risposta trovata cercando un var_dumpequivalente php in ruby, ho scoperto che ppin questo caso è molto usaful, guarda qui - stackoverflow.com/questions/6501506/ruby-inspect-readability/…
Rabin

Si noti che p objectè un alias perputs object.inspect
Jan Klimo,

54

È possibile trovare un uso per il methodsmetodo che restituisce una matrice di metodi per un oggetto. Non è lo stesso di print_r, ma a volte è ancora utile.

>> "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'uso dell'introspezione fa parte del divertimento di Ruby. È spesso utile sottrarre un oggetto instance_methodsdalla classe "in questione per ottenere metodi unici:(String.instance_methods - Object.instance_methods).sort
Tin Man,

2
questa dovrebbe essere la risposta corretta come mi aspettavo questo quando trovavo questa pagina.
jaycode,

.methods.sortè molto utile Esiste un modo "intelligente" per mostrare rapidamente metodi che sono (vagamente) unici per quel particolare oggetto? Ad esempio un metodo come .to_spotrebbe apparire spesso, quindi non è poi così utile, ma alcuni potrebbe essere molto utile conoscere determinati metodi per determinati oggetti. Soprattutto nei casi che non sono ovvi. C'è un modo per ottenerli rapidamente? (caso specifico, ho un PG::Resultoggetto e voglio valutare rapidamente i probabili metodi che potrei trovare utili.
Stevec

51

Il to_yamlmetodo sembra essere utile a volte:

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

puts $foo.to_yaml

ritorna

--- 
:age: 43
:name: Clem

(Dipende dal YAMLcaricamento di alcuni moduli? O che in genere sarebbe disponibile?)


3
Sì, to_yamlrichiede il caricamento del modello YAML. Fa parte della libreria standard di Ruby, però.
Chuck,

questo è stato utile quando stavo cercando di ispezionare un oggetto Amazon S3 in una console dell'app Rails.
Paolo,

32
p object

Doc Ruby per p.

p(*args) public

Per ogni oggetto, scrive direttamente obj.inspect seguito da una nuova riga nell'output standard del programma.


Non è lo stesso di variabile.to_s? Ho scoperto che stampa solo un riferimento a un oggetto a meno che la classe non lo ignori esplicitamente
roryf

15

Se stai cercando solo le variabili di istanza nell'oggetto, questo potrebbe essere utile:

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

o come una copertina per copia e incolla:

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

10

mette foo.to_json

potrebbe tornare utile poiché il modulo json è caricato per impostazione predefinita


4
to_jsonnon viene caricato per impostazione predefinita in 1.8.7 o 1.9.2.
l'Uomo di latta il

5

Se si desidera stampare un JSON già rientrato :

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

5

Mi sono imbattuto in questo thread perché stavo cercando qualcosa di simile. Mi piacciono le risposte e mi hanno dato alcune idee, quindi ho testato il metodo .to_hash e ho lavorato molto bene anche per il caso d'uso. 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_namenon ha funzionato, ma object.attributesha un bel hash di chiavi e valori. Questo mi ha aiutato, grazie!
d3vkit,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.