Proc的Ruby比较操作?

时间:2015-07-04 20:01:23

标签: ruby

在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

2 个答案:

答案 0 :(得分:1)

这称为功能问题,相当于解决停机问题。想一想。如果这是可能的,那么你可以像这样解决停机问题:

infinite_loop = -> { nil while true }
some_program == infinite_loop # => true

因此,无法通过算法确定两个程序是否计算相同的函数。

答案 1 :(得分:0)

您可以尝试decompose procs back into Ruby source code strings using ruby2ruby,然后比较它们。但是,要处理一些细微差别,例如不影响行为的变量名,您可能希望获得一个语法树,并编写一些更复杂的比较。

请记住,这种方法是代码的比较,而不是函数的效果。如果它们的编写方式不同,它将无法检测到两个执行相同操作的函数。