Bagaimana cara membuang bidang objek ke konsol?

265

Saat saya menjalankan skrip Ruby sederhana, apa cara termudah untuk membuang bidang objek ke konsol?

Saya mencari sesuatu yang mirip dengan PHP print_r()yang akan bekerja dengan array juga.

roryf
sumber

Jawaban:

421

Mungkin:

puts variable.inspect
Christian Lescuyer
sumber
15
Menambahkan inspectmetode ke kelas Anda memungkinkan Anda untuk menentukan bagaimana atribut kelas ditampilkan, daripada bergantung pada output default. Banyak kelas yang tidak mengimplementasikannya dengan baik, tetapi bisa sangat berguna saat melakukan debugging. Ruby akan kembali ke to_sjika tidak menemukan metode inspeksi `.
the Tin Man
4
Tautan saat ini rusak, Lihat yang ini ruby-doc.org/core-2.0/Object.html#method-i-inspect
SamFlushing
5
server = TCPServer.new 0 ; puts server.inspect #<TCPServer:fd 9> => nil . itu tidak akan berfungsi untuk objek paling kompleks.
ribamar
Karena ini adalah jawaban pertama yang ditemukan ketika mencari var_dumpsetara dengan php di ruby, saya menemukan itu ppjauh usaful dalam kasus itu, lihat di sini - stackoverflow.com/questions/6501506/ruby-inspect-readability/…
Rabin
Perhatikan bahwa p objectini adalah alias untukputs object.inspect
Jan Klimo
54

Anda mungkin menemukan penggunaan methodsmetode yang mengembalikan array metode untuk objek. Ini tidak sama dengan print_r, tetapi masih berguna di kali

>> "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
sumber
9
Menggunakan introspeksi adalah bagian dari kesenangan Ruby. Seringkali berguna untuk mengurangi Objek instance_methodsdari kelas 'dalam pertanyaan untuk mendapatkan metode yang unik:(String.instance_methods - Object.instance_methods).sort
the Tin Man
2
ini seharusnya jawaban yang benar karena saya mengharapkan ini ketika menemukan halaman ini.
jaycode
.methods.sortsangat bermanfaat. Apakah ada cara 'pintar' untuk dengan cepat menunjukkan metode yang (samar-samar) unik untuk objek tertentu? Misalnya metode seperti .to_smungkin sering muncul sehingga tidak semua yang berguna, tetapi beberapa itu bisa sangat berguna untuk mengetahui metode tertentu untuk objek tertentu. Terutama dalam kasus-kasus yang tidak jelas. Apakah ada cara untuk mendapatkannya dengan cepat? (contohnya, saya memiliki PG::Resultobjek, dan ingin segera menilai metode yang mungkin saya temukan berguna.
stevec
51

The to_yamlMetode tampaknya kadang-kadang berguna:

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

puts $foo.to_yaml

kembali

--- 
:age: 43
:name: Clem

(Apakah ini tergantung pada beberapa YAMLmodul yang dimuat? Atau apakah itu biasanya tersedia?)

mjs
sumber
3
Ya, to_yamlmembutuhkan model YAML untuk dimuat. Ini adalah bagian dari pustaka standar Ruby.
Chuck
ini sangat membantu ketika saya mencoba untuk memeriksa objek Amazon S3 di konsol aplikasi Rails.
Paul
32
p object

Dok Ruby untuk p.

p(*args) public

Untuk setiap objek, langsung tulis obj.inspect diikuti oleh baris baru ke output standar program.

rampion
sumber
Bukankah itu sama dengan variable.to_s? Saya telah menemukan bahwa hanya mencetak referensi objek kecuali kelas secara eksplisit
menimpanya
15

Jika Anda mencari hanya variabel instan dalam objek, ini mungkin berguna:

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

atau sebagai one-liner untuk menyalin dan menempel:

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

menempatkan foo.to_json

mungkin berguna karena modul json dimuat secara default

Tjerk
sumber
4
to_jsontidak dimuat secara default di 1.8.7 atau 1.9.2.
the Tin Man
5

Jika Anda ingin mencetak JSON yang sudah indentasi :

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

Saya menemukan utas ini karena saya mencari sesuatu yang serupa. Saya suka tanggapan dan mereka memberi saya beberapa ide jadi saya menguji metode .to_hash dan bekerja sangat baik untuk use case juga. soo:

object.to_hash

Gregor
sumber
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", "[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
sumber
4
undefined method 'attributes' for ...
yegor256
3
object.attributes_nametidak bekerja, tetapi object.attributestidak untuk mendapatkan hash kunci dan nilai yang bagus. Ini membantu saya, terima kasih!
d3vkit