2013-06-04 42 views
2

我正在与IRB(实际上是Wirble)一起练习。我想知道IRB内部的任何黑客行为是否可以被转储到一个文件中供以后分析,编辑和重用?红宝石IRB - 倾销所有类

您在旅途中创建类,方法,数据和互动环节不时包含有价值的里程碑,你与你的代码演变 - 所以这将是宝贵的源代码形式重用。

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

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

,然后在年底转储类A作为

class A 

    def m1 
    end 

    def m2 
    end 

end 

(不一定pretty-打印代码:-))

编辑:回复:@ DGM /撬:“pry”似乎很酷,但它的内省似乎有点bug,而且它没有做预期的事情。我做了什么的正上方,且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 

编辑:我已经提交了一份bug报告,并@banister是用撬问题非常有帮助的,看到的ticket,那里有非常有价值的数据。

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

回答

0

有这样的文件。看看〜/ .irb历史:

$ 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 
+0

这不是我一直在寻找,但还是谢谢你DNNX! :-) – TFuto

0

不幸的是,在红宝石没有办法转储动态创建类的源。例如:

>> class Test 
>> value = rand 
>> define_method(:f) do 
?>  value 
>> end 
>> end 
=> #<Proc:[email protected](irb):3 (lambda)> 
>> Test.new.f 
=> 0.7602337424749085 
>> Test.new.f 
=> 0.7602337424749085 

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

你可以做到这一点,那么唯一真正的方法是只使用IRB历史,并提取你从那里需要什么。该文件位于~/.irb-history。这可能会自动化(例如,从当前IRB会话中提取该文件的定义),但我认为任何人都没有做到这一点。

+0

好吧,运气不好,然后...... :-)谢谢大卫! – TFuto

2

我不知道IRB,但如果你使用更强大的pry被设计为IRB一个更强大的替代品,你可以这样做:

 
1] pry(main)> class Foo 
[1] pry(main)* def bar 
[1] pry(main)*  1 
[1] pry(main)* end 
[1] pry(main)* end 
=> nil 
[2] pry(main)> show-method Foo#bar 

From: (pry) @ line 2: 
Number of lines: 3 
Owner: Foo 
Visibility: public 

def bar 
    1 
end 
[3] pry(main)> show-method Foo 

From: (pry) @ line 1: 
Number of lines: 5 

class Foo 
    def bar 
    1 
    end 
end 
+0

谢谢@DGM,这个“撬”工具看起来很有前途。我已经将测试运行的数据添加到了帖子中。不幸的是,“撬”方法增加了扼流圈。 – TFuto