首页 > 解决方案 > 从 Ruby 文件访问 Pry 的 show-source 方法

问题描述

show-source是否可以从 Ruby 文件中访问 Pry 的方法?如果是这样,这是如何完成的?

例如,如果我有这个文件:

# 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,尽管我无法成功调用任何方法。processcontent_for

我最好的假设是content_for处理这个问题的方法,使用从父类(即Pry::CodeObject.lookup(obj_name, _pry_, :super => opts[:super]))分配的代码对象,尽管我无法破解它。

有人有这样做的任何想法或例子吗?

标签: ruby-on-railsrubypry

解决方案


Ruby 有内置方法Method#source_location可用于查找源的位置。method_source gem以此为基础,根据源位置提取源。但是,这不适用于交互式控制台中定义的方法。方法必须在文件中定义。

这是一个例子:

require 'set'
require 'method_source'

puts Set.method(:[]).source_location
# /home/user/.rvm/rubies/ruby-2.4.1/lib/ruby/2.4.0/set.rb
# 74
#=> nil

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

请记住,所有核心 Ruby 方法都是用 C 编写的,并nil作为源位置返回。1.method(:+).source_location #=> nil标准库是用 Ruby 本身编写的。因此,上面的示例适用于Set方法。


推荐阅读