ruby-on-rails - 从 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
,尽管我无法成功调用任何方法。process
content_for
我最好的假设是content_for
处理这个问题的方法,使用从父类(即Pry::CodeObject.lookup(obj_name, _pry_, :super => opts[:super])
)分配的代码对象,尽管我无法破解它。
有人有这样做的任何想法或例子吗?
解决方案
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方法。
推荐阅读
- r - 更改特定坐标的颜色
- regex - 正则表达式查找替换以添加函数参数
- ios - OTOOL 替代 Linux
- python - 为什么我的 apache kafka 消费者随机忽略排队的消息?
- arrays - 用于反应组件的 Typescript 泛型采用记录数组和键数组
- opencv - OpenCV:stereoRectify 导致空图像
- git - Git - 在在线存储库中有未跟踪的文件
- java - 将 request.getParameterMap() 转换为带有对象列表的 bean
- ios - 为什么当我从下载文件夹中删除文件时找不到构建输入文件?
- php - 当字符串包含单引号时 PHP preg_replace() 返回 null 但否则有效