See Ruby Source Code Inside Pry

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

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

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 without arguments. #=> 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.