'Ruby equivalent of Python's "dir"?
In Python we can "dir" a module, like this:
>>> import re
>>> dir(re)
And it lists all functions in the module. Is there a similar way to do this in Ruby?
Solution 1:[1]
As far as I know not exactly but you get somewhere with
object.methods.sort
Solution 2:[2]
I like to have this in my .irbrc:
class Object
def local_methods
(methods - Object.instance_methods).sort
end
end
So when I'm in irb:
>> Time.now.local_methods
=> ["+", "-", "<", "<=", "<=>", ">", ">=", "_dump", "asctime", "between?", "ctime", "day", "dst?", "getgm", "getlocal", "getutc", "gmt?", "gmt_offset", "gmtime", "gmtoff", "hour", "isdst", "localtime", "mday", "min", "mon", "month", "sec", "strftime", "succ", "to_f", "to_i", "tv_sec", "tv_usec", "usec", "utc", "utc?", "utc_offset", "wday", "yday", "year", "zone"]
Or even cuter - with grep:
>> Time.now.local_methods.grep /str/
=> ["strftime"]
Solution 3:[3]
Tip for "searching" for a method in irb:
"something".methods.select {|item| item =~ /query/ }
Tip for trying out methods on a value for comparison:
value = "something"
[:upcase, :downcase, :capitalize].collect {|method| [method, value.send(method)] }
Also, note that you won't get all the same information as Python's dir with object.methods. You have to use a combination of object.methods and class.constants, also class.singleton_methods to get the class methods.
Solution 4:[4]
You can send the methods method to a value. It will list all the methods the value responds to.
>> "a string".methods
=> [:unicode_normalize, :unicode_normalize!, :ascii_only?, :to_r, :encode, ... ]
There are other methods like this, such as instance_methods which you can read about in the docs: e.g https://ruby-doc.org/core-2.7.3/Module.html#instance_methods-method
Solution 5:[5]
I'd go for something like this:
y String.methods.sort
Which will give you a yaml representation of the sorted array of methods. Note that this can be used to list the methods of both classes and objects.
Solution 6:[6]
Maybe not answering the original question (depends on the use case), but for those who are looking for this to be used in the irb only, you can use "double-TAB" for autocompletion. Which, effectively, can also list (almost all) the methods available for a given object.
Put the following line into your ~/.irbrc file:
require 'irb/completion'
Now, (re)start the irb, start typing a method and hit TAB twice - irb autocompletes the input!
I actually learned it here: http://drnicwilliams.com/2006/10/12/my-irbrc-for-consoleirb/
Solution 7:[7]
Not really. Like the others said, you can get part of what you want by listing class instance methods (e.g. String.instance_methods) but that doesn't help you if a file you open reopens a class (unless you check before and after).
If you don't need programmatic access to the list of methods, consider checking out the documentation for a class, module or method using the ri command line tool.
Solution 8:[8]
I would have made this a comment to jonelf's answer, but apparently I don't have enough rep.
some_object.methods.sort - Object.new.methods
This isn't exactly what you were asking as others have said, but it gives you the info you are after.
Solution 9:[9]
If I stricly read your question, I must answer it that way: a file as specified by require in Ruby is just a container and does not have necessarely have any relation with a class. The content can be:
- a class
- a module
- plain code
or any combination of the above, several times. So you can not directly ask for all methods in a given file.
If you meant to list all methods of a given module or class, then the other answers are what you seek (mainly using the #methods method on a module name or class).
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Jonas Elfström |
| Solution 2 | Commander Keen |
| Solution 3 | method |
| Solution 4 | |
| Solution 5 | Codebeef |
| Solution 6 | |
| Solution 7 | rampion |
| Solution 8 | jshen |
| Solution 9 | Keltia |
