When I'm running a simple Ruby script, what's the easiest way to dump an object's fields to the console?
I'm looking for something similar to PHP's print_r()
that will work with arrays as well.
When I'm running a simple Ruby script, what's the easiest way to dump an object's fields to the console?
I'm looking for something similar to PHP's print_r()
that will work with arrays as well.
Possibly:
puts variable.inspect
server = TCPServer.new 0 ; puts server.inspect #<TCPServer:fd 9> => nil
. it won't work for most complex objects. –
Harday var_dump
equivalent in ruby, i found that pp
is much usaful in that case, look here - https://mcmap.net/q/100949/-ruby-inspect-readability/… –
Orthopter p object
is an alias for puts object.inspect
–
Neanderthal inspect
works great for attributes, but @dylanfm's answer is better if you want to see methods –
Nightlong You might find a use for the methods
method which returns an array of methods for an object. It's not the same as print_r
, but still useful at times.
>> "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"]
instance_methods
from the class' in question to get the methods that are unique: (String.instance_methods - Object.instance_methods).sort
–
Litt .methods.sort
is very useful. Is there any 'smart' way to quickly show methods that are (vaguely) unique to that particular object? E.g. a method like .to_s
might show up often so it's not all that useful, but some it could be very handy to know of certain methods for certain objects. Especially in cases that aren't obvious. Is there any way to quickly get these? (case in point, I have a PG::Result
object, and want to quickly assess the likely methods I could possibly find useful. –
Wrath private_methods
, public_methods
, and protected_methods
, if helpful (as well as private_instance_methods
, public_instance_methods
, protected_instance_methods
). –
Nightlong The to_yaml
method seems to be useful sometimes:
$foo = {:name => "Clem", :age => 43}
puts $foo.to_yaml
returns
---
:age: 43
:name: Clem
(Does this depend on some YAML
module being loaded? Or would that typically be available?)
to_yaml
requires the YAML model to be loaded. It is part of the Ruby standard library, though. –
Blane to_yaml
is much prettier than inspect
, -1 because to_yaml
doesn't include anything about methods (class or instance) –
Nightlong p object
For each object, directly writes obj.inspect followed by a newline to the program’s standard output.
If you're looking for just the instance variables in the object, this might be useful:
obj.instance_variables.each do |var|
puts [var, obj.instance_variable_get(var).inspect].join(":")
end
or as a one-liner for copy and pasting:
obj.instance_variables.each{ |var| puts [var, obj.instance_variable_get(var).inspect].join(":")}
puts foo.to_json
might come in handy since the json module is loaded by default
to_json
isn't loaded by default in 1.8.7 or 1.9.2. –
Litt If you want to print an already indented JSON:
require 'json'
...
puts JSON.pretty_generate(JSON.parse(object.to_json))
I came across this thread because I was looking for something similar. I like the responses and they gave me some ideas so I tested the .to_hash method and worked really well for the use case too. soo:
object.to_hash
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]
undefined method 'attributes' for ...
–
Cathar object.attributes_name
didn't work, but object.attributes
does to get a nice hash of keys and values. This helped me out, thanks! –
Churn pp File.stat('/tmp')
#<File::Stat
dev=0x1000004,
ino=71426291,
mode=041777 (directory rwxrwxrwt),
nlink=15,
uid=0 (root),
gid=0 (wheel),
rdev=0x0 (0, 0),
size=480,
blksize=4096,
blocks=0,
atime=2021-04-20 17:50:33.062419819 +0800 (1618912233),
mtime=2021-04-21 11:35:32.808546288 +0800 (1618976132),
ctime=2021-04-21 11:35:32.808546288 +0800 (1618976132)>
I'm using own solution to print and debug variables is https://github.com/igorkasyanchuk/wrapped_print
you can simply call user.wp
to see in the logs a value of this variable
instead of:
puts "-"*10
puts user.inspect
puts "-"*10
© 2022 - 2024 — McMap. All rights reserved.
inspect
method to your class allows you to define how the class' attributes are displayed, rather than rely on default output. A lot of classes don't implement it well, but it can be really useful when debugging. Ruby will fall back toto_s
if it can't find an inspect` method. – Litt