如果我在IRB中定义一个方法,有没有办法在会话后期查看其来源?
> def my_method
> puts "hi"
> end
稍后输出几个屏幕我希望能够写出类似
的内容> source my_method
然后回来:
=> def my_method; puts "hi"; end;
这可能吗?
答案 0 :(得分:14)
答案 1 :(得分:14)
不在IRB中,但在Pry中,此功能是内置的。
看哪:
pry(main)> def hello
pry(main)* puts "hello my friend, it's a strange world we live in"
pry(main)* puts "yes! the rich give their mistresses tiny, illuminated dying things"
pry(main)* puts "and life is neither sacred, nor noble, nor good"
pry(main)* end
=> nil
pry(main)> show-method hello
From: (pry) @ line 1:
Number of lines: 5
def hello
puts "hello my friend, it's a strange world we live in"
puts "yes! the rich give their mistresses tiny, illuminated dying things"
puts "and life is neither sacred, nor noble, nor good"
end
pry(main)>
答案 2 :(得分:5)
如果您使用Ruby 1.9.2和更新版本的sourcify gem而不是Rubygems.org上提供的(例如从GitHub构建源代码),您可以这样做:
>> require 'sourcify'
=> true
>>
.. class MyMath
.. def self.sum(x, y)
.. x + y # (blah)
.. end
.. end
=> nil
>>
.. MyMath.method(:sum).to_source
=> "def sum(x, y)\n (x + y)\nend"
>> MyMath.method(:sum).to_raw_source
=> "def sum(x, y)\n x + y # (blah)\n end"
编辑:还要查看method_source,这是pry在内部使用的内容。
答案 3 :(得分:2)
我使用的是method_source我有方法代码,它基本上是我的宝石包装器。在Gemfile for Rails应用程序中添加method_source。并使用以下代码创建初始化程序。
# Takes instance/class, method and displays source code and comments
def code(ints_or_clazz, method)
method = method.to_sym
clazz = ints_or_clazz.is_a?(Class) ? ints_or_clazz : ints_or_clazz.class
puts "** Comments: "
clazz.instance_method(method).comment.display
puts "** Source:"
clazz.instance_method(method).source.display
end
用法是:
code Foo, :bar
或实例
code foo_instance, :bar
更好的方法是使用带有irb扩展名的in / lib文件夹中的类,而不只是在其中一个初始化程序中 (或创建自己的)