给定一个Proc对象,是否可以查看其中的代码?
例如:
p = Proc.new{test = 0}
Run Code Online (Sandbox Code Playgroud)
我需要的是从某个已经创建的Proc对象获取字符串"test = 0"的方法.
举个例子:
write_as_string { puts 'x' }
Run Code Online (Sandbox Code Playgroud)
然后我希望能够做到
def write_as_string(&block)
puts block.to_s
end
Run Code Online (Sandbox Code Playgroud)
当我执行此操作时,我希望输出为:
"puts 'x'"
Run Code Online (Sandbox Code Playgroud)
我希望能够接收块并获取块的实际代码而不是执行它.
动机:创建DSL,我希望将模拟转换为许多其他方法调用,隐藏在调用代码中 - 使用现有的对象和方法,而不用猴子修补它们.
对此的任何想法都会很棒!
谢谢
本
我有一个方法,需要一个块.
显然我不知道将要传递什么,并且出于奇怪的原因我不会进入这里我想要打印块的内容.
有没有办法做到这一点?
可能重复:
如何从Proc对象中提取代码?
将proc或方法对象转换为源字符串的最佳方法是什么?到目前为止,我尝试了两种方法.一个是实现proc的源位置并读取该部分源代码.另一种是使用库巫师和开膛手.我不确定这样做的正确方法是什么.什么是最好的可能取决于各种因素:稳健性,对原始的忠诚度,速度等.包括我建议的方法,但不限于它们,请建议一个策略,并评估其局限性.
使用 Ruby 1.9.2
问题
比较两个过程的内容,而不是结果。我知道由于停止问题而无法测试结果,但这没关系;反正我也不想测试结果。
例如
proc {@x == "x"} == proc {@x == "x"} => false # doh!
Run Code Online (Sandbox Code Playgroud)
这会返回 false,因为过程中的对象不相同。
我笨重的解决方案
我有一个解决方案,有点像我想要的那样,但它并没有真正测试过程是否“等于”我放入其中的内容。在我的具体情况下,我的过程的格式将始终是对实例变量的布尔测试,如下所示:
{@x == "x" && @y != "y" || @z == String}
Run Code Online (Sandbox Code Playgroud)
我编写了一个动态构建类并创建设置为指定值的实例变量的方法:
def create_proc_tester(property_value_hash)
new_class = Class.new.new
new_class.class.class_eval do
define_method(:xql?) { |&block| instance_eval &block }
end
property_value_hash.each do |key, value|
new_class.instance_variable_set("@#{key}", value)
end
new_class
end
Run Code Online (Sandbox Code Playgroud)
可以这样使用:
class Foo
attr_accessor :block
end
foo = Foo.new
foo.block = proc {@x == "x" && @y != "y" || …Run Code Online (Sandbox Code Playgroud)