I learned something new about the pry
tool today, after reading this post from John Mair (the creator of pry).
You can use the show-method
command to lookup the source code to Ruby’s standard library methods:
[1] pry(main)> require 'uri'
[2] pry(main)> show-method URI::HTTP#request_uri
From: /Users/stevenschobert/.asdf/installs/ruby/2.4.2/lib/ruby/2.4.0/uri/http.rb @ line 102:
Owner: URI::HTTP
Visibility: public
Number of lines: 6
def request_uri
return unless @path
url = @query ? "#@path?#@query" : @path.dup
url.start_with?(?/.freeze) ? url : ?/ + url
end
This also works for methods implemented in C:
[3] pry(main)> show-method String#chomp
From: string.c (C Method):
Owner: String
Visibility: public
Number of lines: 7
static VALUE
rb_str_chomp(int argc, VALUE *argv, VALUE str)
{
VALUE rs = chomp_rs(argc, argv);
if (NIL_P(rs)) return rb_str_dup(str);
return rb_str_subseq(str, 0, chompped_length(str, rs));
}
In the example above, it’s hard to get a good idea of what String#chomp
is doing, because most of the work happens in the chomp_rs
function. Thanks to a recent addition, you can now lookup these functions in Pry as well:
[4] pry(main)> show-source chomp_rs
From: /Users/stevenschobert/.pry.d/ruby-2_4_2/string.c @ line 8122:
Number of implementations: 1
Number of lines: 13
static VALUE
chomp_rs(int argc, const VALUE *argv)
{
rb_check_arity(argc, 0, 1);
if (argc > 0) {
VALUE rs = argv[0];
if (!NIL_P(rs)) StringValue(rs);
return rs;
}
else {
return rb_rs;
}
}
Another handy command is the show-doc
command, which will show documentation for the method:
[5] pry(main)> show-doc Time.now
From: time.c (C Method):
Owner: #<Class:Time>
Visibility: public
Signature: now()
Number of lines: 4
Creates a new Time object for the current time.
This is same as Time.new without arguments.
Time.now #=> 2009-06-24 12:39:54 +0900
Note: Both the show-doc
and show-method
commands require the have pry-doc
add-on gem installed:
gem install pry-doc
I’m a heavy Dash user, so I typically use that to lookup docs/source code when working in Ruby. But having access to them in pry
is definitely going to come in handy for cases when I don’t have direct access to Dash. Dash also can’t lookup the internal C methods like chomp_rs
like Pry now can.
UPDATE: I had originally written that the C support to the show-method
command was new until John Mair kindly corrected me. What’s new is seeing C functions that don’t directly map to Ruby methods, like chomp_rs
.