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.

Odpowiedzi:


420

Możliwie:

puts variable.inspect

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

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


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.


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

10

stawia foo.to_json

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


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

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


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_namenie działało, ale object.attributesrobi, aby uzyskać niezły skrót kluczy i wartości. To mi pomogło, dzięki!
d3vkit
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.