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.

Antworten:


420

Möglicherweise:

puts variable.inspect

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

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


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


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

10

setzt foo.to_json

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


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

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


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", "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_namehat nicht funktioniert, object.attributesfunktioniert aber , um einen schönen Hash von Schlüsseln und Werten zu erhalten. Das hat mir geholfen, danke!
d3vkit
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.