从 Ruby 文件访问 Pry 的 show-source 方法
Access Pry's show-source method from Ruby file
是否可以从 Ruby 文件中访问 Pry 的 show-source
方法?如果是这样,这是怎么做到的?
例如,如果我有这个文件:
# 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
class 中的一些方法,它继承自 Pry::Command::ShowInfo
.
Pry::Command::ShowSource
显示了三个方法:options
、process
和 content_for
,尽管我无法成功调用任何方法。
我最好的假设是 content_for
方法处理这个问题,使用从父 class(即 Pry::CodeObject.lookup(obj_name, _pry_, :super => opts[:super])
)分配的代码对象,尽管我无法做到破解这个。
有人对此有任何想法或例子吗?
您可以在不使用 pry
和 Object#method and Method#source_location
as described in this answer:
的情况下访问方法的源代码
Ruby 具有内置方法 Method#source_location which can be used to find the location of the source. The 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 编写的,并且 return nil
作为源位置。 1.method(:+).source_location #=> nil
标准库是用 Ruby 自己编写的。因此,上面的示例适用于 Set 方法。
是否可以从 Ruby 文件中访问 Pry 的 show-source
方法?如果是这样,这是怎么做到的?
例如,如果我有这个文件:
# 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
class 中的一些方法,它继承自 Pry::Command::ShowInfo
.
Pry::Command::ShowSource
显示了三个方法:options
、process
和 content_for
,尽管我无法成功调用任何方法。
我最好的假设是 content_for
方法处理这个问题,使用从父 class(即 Pry::CodeObject.lookup(obj_name, _pry_, :super => opts[:super])
)分配的代码对象,尽管我无法做到破解这个。
有人对此有任何想法或例子吗?
您可以在不使用 pry
和 Object#method and Method#source_location
as described in this answer:
Ruby 具有内置方法 Method#source_location which can be used to find the location of the source. The 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 编写的,并且 return nil
作为源位置。 1.method(:+).source_location #=> nil
标准库是用 Ruby 自己编写的。因此,上面的示例适用于 Set 方法。