Доступ к методу show-source Pry из файла Ruby

Можно ли получить доступ к методу Pry show-source из файла Ruby? Если да, то как это делается?

Например, если бы у меня был этот файл:

# testing.rb

require 'pry' 

def testing
  puts 'hi'
end

puts show-source testing

И запустил ruby testing.rb, мне нужен вывод:

Owner: testing.rb
Visibility: public
Number of lines: 3

def testing
  puts 'hi'
end

Чтобы объяснить причину этого, у меня есть тест, заглушающий метод, хотя оригинал, похоже, вызывается время от времени, и я подумал, что было бы удобно вывести источник вызова, чтобы увидеть, откуда он исходит. Я знаю, что есть более простые способы сделать это, хотя начал с этой кроличьей норы, и мне интересно посмотреть, можно ли это сделать :)

Выполнение слегка головокружительного show-source show-source показывает несколько методов в классе Pry::Command::ShowSource, который наследуется от Pry::Command::ShowInfo.

Pry::Command::ShowSource показывает три метода: options, process и content_for, хотя мне не удалось успешно вызвать ни один из них.

Мое лучшее предположение заключается в том, что метод content_for справляется с этим, работая с объектом кода, назначенным из родительского класса (то есть Pry::CodeObject.lookup(obj_name, _pry_, :super => opts[:super])), хотя мне не удалось взломать это.

У кого-нибудь есть идеи или примеры того, как это сделать?


person SRack    schedule 07.01.2019    source источник


Ответы (2)


В Ruby есть встроенный метод Method#source_location< /em>, который можно использовать для поиска местоположения источника. Гем method_source основан на этом, извлекая источник на основе местоположения источника. . Однако это не работает для методов, определенных в интерактивной консоли. Методы должны быть определены в файле.

Вот пример:

require 'set'
require 'method_source'

set_square_bracket_method = Set.method(:[])

puts set_square_bracket_method.source_location
# /home/user/.rvm/rubies/ruby-2.4.1/lib/ruby/2.4.0/set.rb
# 74
#=> nil

puts set_square_bracket_method.source
# def self.[](*ary)
#   new(ary)
# end
#=> nil

Имейте в виду, что все основные методы Ruby написаны на C и возвращают nil в качестве исходного местоположения. 1.method(:+).source_location #=> nil Стандартная библиотека написана на самом Ruby. Поэтому приведенный выше пример работает для методов Set.

person 3limin4t0r    schedule 07.01.2019
comment
Отлично - спасибо @JohanWentholt. Это идеально соответствует тому, что я ищу. Оцените ответ. - person SRack; 07.01.2019

Вы можете получить доступ к источнику метода без использования pry с Object# метод и Method#source_location, как описано в этом ответе: https://stackoverflow.com/a/46966145/580346

person mrzasa    schedule 07.01.2019