Bir nesnenin alanlarını konsola nasıl dökebilirim?


265

Basit bir Ruby komut dosyası çalıştırırken, bir nesnenin alanlarını konsola dökmenin en kolay yolu nedir?

Ben de print_r()diziler ile çalışacak PHP benzer bir şey arıyorum .

Yanıtlar:


420

Muhtemelen:

puts variable.inspect

15
inspectSınıfınıza bir yöntem eklemek , varsayılan çıktıya güvenmek yerine sınıfın niteliklerinin nasıl görüntüleneceğini tanımlamanızı sağlar. Birçok sınıf bunu iyi uygulamıyor, ancak hata ayıklama sırasında gerçekten yararlı olabilir. Ruby to_sbir teftiş yöntemi bulamazsa geri döner .
Tin Man

4
Şu anki bağlantı bozuk, Bunu gör ruby-doc.org/core-2.0/Object.html#method-i-inspect
SamFlushing

5
server = TCPServer.new 0 ; puts server.inspect #<TCPServer:fd 9> => nil . çoğu karmaşık nesne için çalışmaz.
ribamar

Bu var_dumpyakut bir php eşdeğeri ararken bulunan ilk cevap olduğu için pp, bu durumda çok yararlı olduğunu buldum , buraya bakın - stackoverflow.com/questions/6501506/ruby-inspect-readability/…
Rabin

Not p objectbir olduğunu takma içinputs object.inspect
Jan Klimo

54

methodsNesne için bir dizi yöntem döndüren yöntem için bir kullanım bulabilirsiniz . Aynı değil print_r, ama yine de zaman zaman faydalıdır.

>> "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
İçgözlemi kullanmak Ruby eğlencesinin bir parçasıdır. instance_methodsEşsiz yöntemleri elde etmek için söz konusu bir Nesnenin sınıftan çıkarılması genellikle yararlıdır :(String.instance_methods - Object.instance_methods).sort
Tin Man

2
bu sayfayı bulurken bunu beklediğim için bu doğru cevap olmalı.
jaycode

.methods.sortçok kullanışlı. Belirli bir nesneye (belirsiz) benzersiz olan yöntemleri hızlı bir şekilde göstermenin 'akıllı' bir yolu var mı? Örneğin, böyle bir yöntem .to_ssık sık görünebilir, bu yüzden bu kadar kullanışlı değildir, ancak bazıları belirli nesneler için belirli yöntemleri bilmek çok kullanışlı olabilir. Özellikle açık olmayan durumlarda. Bunları hızlı bir şekilde almanın bir yolu var mı? (bu durumda, bir PG::Result
nesnem var ve

51

to_yamlYöntem kullanışlı bazen gibi görünüyor:

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

puts $foo.to_yaml

İadeler

--- 
:age: 43
:name: Clem

(Bu, bazı YAMLmodüllerin yüklenmesine mi bağlı ? Yoksa normal olarak kullanılabilir mi?)


3
Evet, to_yamlYAML modelinin yüklenmesini gerektirir. Yine de Ruby standart kütüphanesinin bir parçası.
Chuck

bir Rails uygulama konsolunda bir Amazon S3 nesnesini incelemeye çalışırken bu yardımcı oldu.
Paul

32
p object

İçin Ruby doc p.

p(*args) public

Her nesne için, programın standart çıktısına doğrudan obj.inspect ve ardından bir yeni satır yazar.


Bu değişken.to_s ile aynı değil mi? Sınıf açıkça geçersiz kılmadığı sürece sadece bir nesne başvurusu yazdırdığını buldum
roryf

15

Nesnede yalnızca örnek değişkenleri arıyorsanız, bu yararlı olabilir:

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

veya kopyalama ve yapıştırma için tek astar olarak:

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

10

koyar foo.to_json

modülü varsayılan olarak yüklendiği için kullanışlı olabilir


4
to_json1.8.7 veya 1.9.2'de varsayılan olarak yüklenmez.
Tin Man

5

Önceden girintili bir JSON yazdırmak istiyorsanız :

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

5

Benzer bir şey arıyordum çünkü bu iş parçacığına rastladım. Yanıtları beğendim ve .to_hash yöntemini test ettim ve kullanım durumu için de çok iyi çalıştım. 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 ...
ye2525

3
object.attributes_nameişe yaramadı, ama object.attributesanahtar ve değerlerin güzel bir karma elde etmek için yapar. Bu bana yardımcı oldu, teşekkürler!
d3vkit
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.