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.

Jawaban:


421

Mungkin:

puts variable.inspect

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

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


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.


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

10

menempatkan foo.to_json

mungkin berguna karena modul json dimuat secara default


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

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


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", "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_nametidak bekerja, tetapi object.attributestidak untuk mendapatkan hash kunci dan nilai yang bagus. Ini membantu saya, terima kasih!
d3vkit
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.