在ruby 2.2.0上概述的here(如下所示)的比较运算符实际上只是将Proc#调用结果与另一个对象进行比较。文档内容如下:
proc === obj→result_of_proc
调用块 用obj作为proc的参数,比如#call。这是允许一个过程 object成为case语句中when子句的目标。
我正在寻找的是:
a = Proc.new { puts 'hi' }
b = Proc.new { puts 'hi' }
a == b
# => true
这可以以某种方式完成吗?
尝试解决this gist上的缓存失效问题(代码如下所示)。如果已有缓存文件,则忽略对Kinescope块的任何更改。
module Kinescope
def self.film(reel,&block)
file_name = "kinescoped_#{reel}.ml"
begin
Marshal.load(File.read(file_name))
rescue
data = yield
File.open(file_name,'w') do |f|
f.write(Marshal.dump(data))
end
data
end
end
end
def time_consuming_calculation
sleep 60
true
end
test = Kinescope.film :big_data do
# 'film' gigantic data here
result = []
File.foreach('big_file.txt') do |line|
result << line if time_consuming_calculation
end
result
end
答案 0 :(得分:1)
这称为功能问题,相当于解决停机问题。想一想。如果这是可能的,那么你可以像这样解决停机问题:
infinite_loop = -> { nil while true }
some_program == infinite_loop # => true
因此,无法通过算法确定两个程序是否计算相同的函数。
答案 1 :(得分:0)
您可以尝试decompose procs back into Ruby source code strings using ruby2ruby
,然后比较它们。但是,要处理一些细微差别,例如不影响行为的变量名,您可能希望获得一个语法树,并编写一些更复杂的比较。
请记住,这种方法是代码的比较,而不是函数的效果。如果它们的编写方式不同,它将无法检测到两个执行相同操作的函数。