Jak zrzucić pola obiektu do konsoli?

264

Kiedy uruchamiam prosty skrypt Ruby, jaki jest najłatwiejszy sposób na zrzucenie pól obiektu na konsolę?

Szukam czegoś podobnego do PHP, print_r()które również będzie działać z tablicami.

roryf
źródło

Odpowiedzi:

420

Możliwie:

puts variable.inspect
Christian Lescuyer
źródło
15
Dodanie inspectmetody do klasy pozwala określić sposób wyświetlania atrybutów klasy, zamiast polegać na domyślnych wynikach. Wiele klas nie implementuje go dobrze, ale może być bardzo przydatne podczas debugowania. Ruby cofnie się, to_sjeśli nie będzie w stanie znaleźć metody inspekcji.
Tin Man
4
Aktualny link jest zepsuty, zobacz ten ruby-doc.org/core-2.0/Object.html#method-i-inspect
SamFlushing
5
server = TCPServer.new 0 ; puts server.inspect #<TCPServer:fd 9> => nil . nie będzie działać w przypadku najbardziej złożonych obiektów.
ribamar
Ponieważ jest to pierwsza odpowiedź znaleziona podczas szukania var_dumpekwiwalentu php w rubinie, okazało się, że ppjest to bardzo przydatne w tym przypadku, spójrz tutaj - stackoverflow.com/questions/6501506/ruby-inspect-readability/…
Rabin
Zauważ, że p objectjest to pseudonim dlaputs object.inspect
Jan Klimo
54

Możesz znaleźć zastosowanie dla methodsmetody, która zwraca tablicę metod dla obiektu. To nie to samo print_r, ale czasem przydatne.

>> "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
źródło
9
Korzystanie z introspekcji jest częścią zabawy Ruby. Często przydatne jest odjęcie obiektu instance_methodsod danej klasy, aby uzyskać unikalne metody:(String.instance_methods - Object.instance_methods).sort
Tin Man
2
to powinna być poprawna odpowiedź, ponieważ spodziewałem się tego podczas znajdowania tej strony.
jaycode
.methods.sortjest bardzo przydatne. Czy istnieje jakiś „inteligentny” sposób szybkiego pokazania metod, które są (niejasno) unikalne dla tego konkretnego obiektu? Na przykład metoda taka .to_smoże się często pojawiać, więc nie jest aż tak przydatna, ale niektóre z nich mogą być bardzo przydatne w przypadku niektórych metod dla niektórych obiektów. Zwłaszcza w przypadkach, które nie są oczywiste. Czy jest jakiś sposób, aby szybko je zdobyć? (w tym przypadku mam PG::Resultobiekt i chcę szybko ocenić prawdopodobne metody, które mogłyby okazać się przydatne.
stevec
50

to_yamlMetoda wydaje się być czasami użyteczne:

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

puts $foo.to_yaml

zwroty

--- 
:age: 43
:name: Clem

(Czy zależy to od YAMLzaładowania jakiegoś modułu? Czy to zazwyczaj będzie dostępne?)

mjs
źródło
3
Tak, to_yamlwymaga załadowania modelu YAML. Jest to jednak część standardowej biblioteki Ruby.
Chuck,
było to pomocne, gdy próbowałem sprawdzić obiekt Amazon S3 w konsoli aplikacji Rails.
Paul
32
p object

Dokument Ruby dla p.

p(*args) public

Dla każdego obiektu zapisuje bezpośrednio obj.inspect, a następnie nowy wiersz na standardowe wyjście programu.

szaleństwo
źródło
Czy to nie to samo, co zmienna.to_s? Zauważyłem, że po prostu wypisuje odwołanie do obiektu, chyba że klasa wyraźnie je zastąpi
roryf
15

Jeśli szukasz tylko zmiennych instancji w obiekcie, może to być przydatne:

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

lub jako jednolinijka do kopiowania i wklejania:

obj.instance_variables.map{|var| puts [var, obj.instance_variable_get(var)].join(":")}
Mikrofon
źródło
10

stawia foo.to_json

może się przydać, ponieważ moduł json jest domyślnie ładowany

tjerk
źródło
4
to_jsonnie jest domyślnie ładowany w 1.8.7 lub 1.9.2.
Tin Man
5

Jeśli chcesz wydrukować już wcięty JSON :

require 'json'
...
puts JSON.pretty_generate(JSON.parse(object.to_json))
ROMANIA_inżynier
źródło
5

Natknąłem się na ten wątek, ponieważ szukałem czegoś podobnego. Lubię odpowiedzi i dali mi kilka pomysłów, więc przetestowałem metodę .to_hash i bardzo dobrze działałem również w przypadku użycia. soo:

object.to_hash

Gregor
źródło
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
źródło
4
undefined method 'attributes' for ...
yegor256
3
object.attributes_namenie działało, ale object.attributesrobi, aby uzyskać niezły skrót kluczy i wartości. To mi pomogło, dzięki!
d3vkit