2

我正在练习 IRB(实际上是 Wirble)。我想知道是否可以将 IRB 内部的任何黑客行为转储到文件中以供以后比较、编辑和重用?

您可以随时随地创建类、方法、数据,并且随着代码的发展,交互式会话会不时包含有价值的里程碑——因此这对于以源代码形式重用是有价值的。

编辑:为了进一步澄清原始问题:我想在 IRB 中这样做:

class A; def m1; end; end
class A; def m2; end; end

然后在最后转储类 A 为

class A

  def m1
  end

  def m2
  end

end

(不一定漂亮地打印代码:-))

编辑:回复:@DGM/pry:“pry”似乎很酷,但它的内省似乎有些错误,而且它没有达到预期的效果。我做了上面的事情,如果我使用了 m1 方法,则没有列出show-method A

[1] pry(main)> class A; def m1; end; end     
=> nil

[2] pry(main)> class A; def m2; end; end
=> nil

[3] pry(main)> show-method A#m1
[...]
class A; def m1; end; end

[4] pry(main)> show-method A#m2
[...]
class A; def m2; end; end

[5] pry(main)> show-method A
[...]
class A; def m2; end; end

编辑:我已经提交了错误报告,@banister 对撬问题非常有帮助,请参阅票证,那里有非常有价值的数据。

编辑:@banister 建议使用edit并且遵循该工作流程是有意义的。

4

4 回答 4

2

我不确定 irb,但如果你使用更强大的pry,它被设计为更强大的 irb 替代品,你可以这样做:

1]撬(主)>类Foo
[1] 撬(主)* def bar
[1] 撬(主)* 1
[1] 撬(主)* 结束
[1] 撬(主)* 结束
=> 无
[2] pry(main)> show-method Foo#bar

来自:(撬)@第 2 行:
行数:3
拥有者:傅
可见性:公开

定义栏
  1
结尾
[3] pry(main)> show-method Foo

来自:(撬)@ 第 1 行:
行数:5

Foo 类
  定义栏
    1
  结尾
结尾
于 2013-06-04T12:48:10.520 回答
1

在 Pry 中,如果您使用edit而不是在 REPL 中创建类,它应该可以正常工作,请参阅以下 showterm:

http://showterm.io/434d8965312292c8830c9#fast

于 2013-06-05T02:12:48.290 回答
0

有这样一个文件。查看~/.irb-history:

$ irb
1.9.3p429 :001 > 2+2
 => 4
1.9.3p429 :002 > 3+3
 => 6
1.9.3p429 :003 > exit
$ tail -n 3 ~/.irb-history
2+2
3+3
exit
于 2013-06-04T11:48:37.007 回答
0

不幸的是,ruby 没有办法转储动态创建的类的源代码。例如:

>> class Test
>>   value = rand
>>   define_method(:f) do 
?>     value
>>   end
>> end
=> #<Proc:0x007fed0b19b2c0@(irb):3 (lambda)>
>> Test.new.f
=> 0.7602337424749085
>> Test.new.f
=> 0.7602337424749085

没有可能的方法来恢复Test类的来源。有各种 gem 可以获取方法的源,但它们通过从它出现的文件中读取源来工作,并且不能与动态生成的方法一起使用。

实现这一目标的唯一真正方法就是使用 IRB 历史记录,并从那里提取您需要的内容。该文件位于~/.irb-history. 可能会自动执行此操作(例如,从当前 IRB 会话中从该文件中提取定义),但我认为尚未有人这样做。

于 2013-06-04T11:53:19.067 回答