How do I inspect the methods of a Ruby object?
methods
takes an optional boolean parameter, which specifies whether to also list the methods from the object's class and its superclasses or just the object's singleton methods. So you can do obj.methods(false)
to only get the singleton methods defined on obj
.
If you want the methods defined by the object's class, but not those defined by its superclasses, you can get that by calling instance_methods(false)
on the object's class, so it's obj.class.instance_methods(false)
.
How to list all methods for an object in Ruby?
The following will list the methods that the User class has that the base Object class does not have...
>> User.methods - Object.methods
=> ["field_types", "maximum", "create!", "active_connections", "to_dropdown",
"content_columns", "su_pw?", "default_timezone", "encode_quoted_value",
"reloadable?", "update", "reset_sequence_name", "default_timezone=",
"validate_find_options", "find_on_conditions_without_deprecation",
"validates_size_of", "execute_simple_calculation", "attr_protected",
"reflections", "table_name_prefix", ...
Note that methods
is a method for Classes and for Class instances.
Here's the methods that my User class has that are not in the ActiveRecord base class:
>> User.methods - ActiveRecord::Base.methods
=> ["field_types", "su_pw?", "set_login_attr", "create_user_and_conf_user",
"original_table_name", "field_type", "authenticate", "set_default_order",
"id_name?", "id_name_column", "original_locking_column", "default_order",
"subclass_associations", ...
# I ran the statements in the console.
Note that the methods created as a result of the (many) has_many relationships defined in the User class are not in the results of the methods
call.
Added Note that :has_many does not add methods directly. Instead, the ActiveRecord machinery uses the Ruby method_missing
and responds_to
techniques to handle method calls on the fly. As a result, the methods are not listed in the methods
method result.
How do I see all the methods/ properties in Object Class
#methods
is the method you want. It simply returns an array of symbols, which are all the names of the methods that object responds to.
Object.new.methods
Or more readable in irb:
puts Object.new.methods.sort.to_yaml
Or for the class methods:
Object.methods
One caveat though, some objects allow methods that won't be listed here. Anything implemented with a hook into #method_missing
won't show up. This includes a lot of ActiveRecord
methods as well as other rails objects.
But so long as nothing tricky is going on, this is the list you seem to want.
How do I dump an object's fields to the console?
Possibly:
puts variable.inspect
Determining type of an object in ruby
The proper way to determine the "type" of an object, which is a wobbly term in the Ruby world, is to call object.class
.
Since classes can inherit from other classes, if you want to determine if an object is "of a particular type" you might call object.is_a?(ClassName)
to see if object
is of type ClassName
or derived from it.
Normally type checking is not done in Ruby, but instead objects are assessed based on their ability to respond to particular methods, commonly called "Duck typing". In other words, if it responds to the methods you want, there's no reason to be particular about the type.
For example, object.is_a?(String)
is too rigid since another class might implement methods that convert it into a string, or make it behave identically to how String behaves. object.respond_to?(:to_s)
would be a better way to test that the object in question does what you want.
Get list of a class' instance methods
You actually want TestClass.instance_methods
, unless you're interested in what TestClass
itself can do.
class TestClass
def method1
end
def method2
end
def method3
end
end
TestClass.methods.grep(/method1/) # => []
TestClass.instance_methods.grep(/method1/) # => ["method1"]
TestClass.methods.grep(/new/) # => ["new"]
Or you can call methods
(not instance_methods
) on the object:
test_object = TestClass.new
test_object.methods.grep(/method1/) # => ["method1"]
Why do this Ruby object have both to_s and inspect methods that appear to do the same thing?
inspect
is used more for debugging and to_s
for end-user or display purposes.
For example, [1,2,3].to_s
and [1,2,3].inspect
produce different output.
Is there a way in Ruby to print out the public methods of an Object
methods
, instance_methods
, public_methods
, private_methods
and protected_methods
all accept a boolean parameter to determine if the methods of your object's parents are included.
For example:
ruby-1.9.2-p0 > class MyClass < Object; def my_method; return true; end; end;
ruby-1.9.2-p0 > MyClass.new.public_methods
=> [:my_method, :nil?, :===, :=~, :!~, :eql?, :hash, :<=>, :class, :singleton_class, :clone, :dup, :initialize_dup, :initialize_clone, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :frozen?, :to_s, :inspect, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :respond_to_missing?, :extend, :display, :method, :public_method, :define_singleton_method, :__id__, :object_id, :to_enum, :enum_for, :==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__]
ruby-1.9.2-p0 > MyClass.new.public_methods(false)
=> [:my_method]
As noted by @Marnen, the methods defined dynamically (eg. with method_missing
) won't appear here. Your only bet for these ones is hoping that the libraries you're using are well documented.
Related Topics
Postgresql Gem Pg Was Unable to Install
Checking If a Method Is Defined on the Class
Sorting a Two-Dimensional Array by Second Value
Building a Windows Executable from My Ruby App
App Pushed to Heroku Still Shows Standard Index Page
Namespacing Thor Commands in a Standalone Ruby Executable
No Implicit Conversion of String into Integer (Typeerror)
Carrierwave Crop Specific Version
Ruby: How to Make a Public Static Method
Ruby: How to Count the Number of Times a String Appears in Another String
Ruby Koan 151 Raising Exceptions
How to Check If a Gem Is Installed
Listing the Names of Associated Models
Code to Generate Gaussian (Normally Distributed) Random Numbers in Ruby
How to Use "Gets" on a Rake Task