Без зависимостей
method = SomeConstant.method(:some_method_name)
file_path, line = method.source_location
# puts 10 lines start from the method define
IO.readlines(file_path)[line-1, 10]
Если вы хотите использовать это более удобно, вы можете открыть класс Method
:
# ~/.irbrc
class Method
def source(limit=10)
file, line = source_location
if file && line
IO.readlines(file)[line-1,limit]
else
nil
end
end
end
И затем просто позвонитьmethod.source
С Pry вы можете использовать show-method
для просмотра источника метода, и вы даже можете увидеть некоторый исходный код ruby c с установленным pry-doc
, согласно документу pry в codde-browing
Обратите внимание, что мы также можем просматривать методы C (из Ruby Core) с помощью плагина pry-doc;мы также демонстрируем альтернативный синтаксис для метода show:
pry(main)> show-method Array#select
From: array.c in Ruby Core (C Method):
Number of lines: 15
static VALUE
rb_ary_select(VALUE ary)
{
VALUE result;
long i;
RETURN_ENUMERATOR(ary, 0, 0);
result = rb_ary_new2(RARRAY_LEN(ary));
for (i = 0; i < RARRAY_LEN(ary); i++) {
if (RTEST(rb_yield(RARRAY_PTR(ary)[i]))) {
rb_ary_push(result, rb_ary_elt(ary, i));
}
}
return result;
}