给定一个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,我希望将模拟转换为许多其他方法调用,隐藏在调用代码中 - 使用现有的对象和方法,而不用猴子修补它们.
对此的任何想法都会很棒!
谢谢
本
这可能吗?
def block_to_s(&blk)
#code to print blocks code here
end
puts block_to_s do
str = "Hello"
str.reverse!
print str
end
Run Code Online (Sandbox Code Playgroud)
这将打印终端的跟随:
str = "Hello"
str.reverse!
print str
Run Code Online (Sandbox Code Playgroud) 使用 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)