Wie speichere ich die Felder eines Objekts auf der Konsole?

264

Was ist der einfachste Weg, um die Felder eines Objekts auf der Konsole abzulegen, wenn ich ein einfaches Ruby-Skript ausführe?

Ich suche etwas Ähnliches wie PHPs, print_r()das auch mit Arrays funktioniert.

roryf
quelle

Antworten:

420

Möglicherweise:

puts variable.inspect
Christian Lescuyer
quelle
15
Durch Hinzufügen einer inspectMethode zu Ihrer Klasse können Sie definieren, wie die Attribute der Klasse angezeigt werden, anstatt sich auf die Standardausgabe zu verlassen. Viele Klassen implementieren es nicht gut, aber es kann beim Debuggen sehr nützlich sein. Ruby to_sgreift zurück, wenn es keine Inspektionsmethode findet.
Der Blechmann
4
Aktueller Link ist defekt. Siehe diesen ruby-doc.org/core-2.0/Object.html#method-i-inspect
SamFlushing
5
server = TCPServer.new 0 ; puts server.inspect #<TCPServer:fd 9> => nil . Es funktioniert nicht für die meisten komplexen Objekte.
Ribamar
Da dies die erste Antwort ist, die bei der Suche nach einem PHP- var_dumpÄquivalent in Ruby gefunden wurde, fand ich, dass ppdies in diesem Fall sehr nützlich ist. Schauen Sie hier - stackoverflow.com/questions/6501506/ruby-inspect-readability/…
Rabin
Beachten Sie, dass dies p objectein Alias fürputs object.inspect
Jan Klimo
54

Möglicherweise finden Sie eine Verwendung für die methodsMethode, die ein Array von Methoden für ein Objekt zurückgibt. Es ist nicht dasselbe wie print_r, aber manchmal immer noch nützlich.

>> "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
quelle
9
Introspektion ist Teil des Spaßes von Ruby. Es ist oft nützlich, ein Objekt instance_methodsvon der fraglichen Klasse zu subtrahieren , um die einzigartigen Methoden zu erhalten:(String.instance_methods - Object.instance_methods).sort
Der Blechmann
2
Dies sollte die richtige Antwort sein, da ich dies beim Auffinden dieser Seite erwartet hatte.
Jaycode
.methods.sortist sehr nützlich. Gibt es eine "intelligente" Möglichkeit, Methoden, die (vage) für dieses bestimmte Objekt einzigartig sind, schnell anzuzeigen? ZB taucht eine Methode wie diese .to_shäufig auf, so dass sie nicht allzu nützlich ist. In einigen Fällen kann es jedoch sehr praktisch sein, bestimmte Methoden für bestimmte Objekte zu kennen. Besonders in Fällen, die nicht offensichtlich sind. Gibt es eine Möglichkeit, diese schnell zu bekommen? (In diesem Fall habe ich ein PG::ResultObjekt und möchte schnell die wahrscheinlichen Methoden einschätzen, die ich möglicherweise nützlich finden könnte.
Stevec
50

Die to_yamlMethode scheint manchmal nützlich zu sein:

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

puts $foo.to_yaml

kehrt zurück

--- 
:age: 43
:name: Clem

(Hängt dies davon ab, YAMLob ein Modul geladen wird? Oder ist das normalerweise verfügbar?)

mjs
quelle
3
Ja, to_yamldas YAML-Modell muss geladen sein. Es ist jedoch Teil der Ruby-Standardbibliothek.
Chuck
Dies war hilfreich, als ich versuchte, ein Amazon S3-Objekt in einer Rails-App-Konsole zu untersuchen.
Paul
32
p object

Ruby doc für p.

p(*args) public

Schreibt für jedes Objekt direkt obj.inspect, gefolgt von einer neuen Zeile in die Standardausgabe des Programms.

Rampion
quelle
Ist das nicht dasselbe wie variable.to_s? Ich habe festgestellt, dass nur eine Objektreferenz
gedruckt wird,
15

Wenn Sie nur nach den Instanzvariablen im Objekt suchen, kann dies hilfreich sein:

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

oder als Einzeiler zum Kopieren und Einfügen:

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

setzt foo.to_json

Dies kann nützlich sein, da das JSON-Modul standardmäßig geladen ist

tjerk
quelle
4
to_jsonwird in 1.8.7 oder 1.9.2 nicht standardmäßig geladen.
Der Blechmann
5

Wenn Sie einen bereits eingerückten JSON drucken möchten :

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

Ich bin auf diesen Thread gestoßen, weil ich nach etwas Ähnlichem gesucht habe. Ich mag die Antworten und sie gaben mir einige Ideen, also habe ich die .to_hash-Methode getestet und auch für den Anwendungsfall sehr gut funktioniert. soo:

object.to_hash

Gregor
quelle
1
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
quelle
4
undefined method 'attributes' for ...
yegor256
3
object.attributes_namehat nicht funktioniert, object.attributesfunktioniert aber , um einen schönen Hash von Schlüsseln und Werten zu erhalten. Das hat mir geholfen, danke!
d3vkit