Получите доступ к методу show-source Pry из файла Ruby - PullRequest
0 голосов
/ 07 января 2019

Возможно ли получить доступ к методу 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])), хотя я не смог взломать это.

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

Ответы [ 2 ]

0 голосов
/ 07 января 2019

В Ruby есть встроенный метод Метод # source_location , который можно использовать для определения местоположения источника. Драгоценный камень 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 методов.

0 голосов
/ 07 января 2019

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

...