如何评估`Proc#==`?

saw*_*awa 15 ruby equality proc

如何Proc#==评估?RDoc说:

prc == other_proc→true或false

如果prc与other_proc是同一个对象,或者它们都是具有相同主体的proc,则返回true.

但目前尚不清楚什么算是"同一个身体".一个条件似乎是arity必须是相同的:

->{} == ->{} # => true
->{} == ->x{} # => false
->x{} == ->x{} # => true
->x{} == ->y{} # => true
->x{} == ->y,z{} # => false
Run Code Online (Sandbox Code Playgroud)

但还有更多.正如RDoc所说,身体很重要:

->{nil} == ->{nil} # => true
->{nil} == ->{false} # => false
->{false} == ->{false} # => true
Run Code Online (Sandbox Code Playgroud)

但与此同时,看起来proc尚未得到充分评估:

->{} == ->{nil} # => false
->{false} == ->{1 == 2} # => false
Run Code Online (Sandbox Code Playgroud)

身体评估的程度如何?

Mar*_*une 9

在Ruby 2.0中有所改变,所以你不应该尝试比较Procs.==除非它们是完全相同的对象,否则它们不会存在.

讨论可以在这里找到.

如果你真的需要比较两个块的代码并使用MRI,你可以RubyVM::InstructionSequence.disassemble(block)在Ruby 2.0中使用,甚至更好RubyVM::InstructionSequence.of(block).