我在 Relish 文档中也找不到它,但 RSpec 毕竟是开源的,所以让我们深入研究一下。在当前版本的更改匹配器中:
module RSpec
module Matchers
module BuiltIn
class Change
def initialize(receiver=nil, message=nil, &block)
@message = message
@value_proc = block || lambda {receiver.__send__(message)}
@expected_after = @expected_before = @minimum = @maximum = @expected_delta = nil
@eval_before = @eval_after = false
end
这都是关于@value_proc
。如果您提供一个块,它会使用它;如果你不提供一个块,它会创建一个新的 lambda,将第二个参数发送到第一个参数。如果您进一步阅读源代码,您将看到该#matches?
方法,其中包含:
@actual_before = evaluate_value_proc
event_proc.call
@actual_after = evaluate_value_proc
evaluate_value_proc
主要在哪里@value_proc.call
。
我认为“传统” RSpec 会让你提供一个明确的块。如果您正在进行元编程,则双参数方法可能更有意义,但即便如此,您也可以使用块方法并调用send
自己。