在块内定义方法

时间:2014-02-05 13:59:26

标签: ruby rspec

我是ruby的新手,我正在使用RSpec编写unittest来研究ruby,在定义自定义匹配器时,RSpec中有一行我无法理解的代码。

RSpec::Matchers.define :be_a_multiple_of do |expected|
  match do |actual|
    do_the_math(actual, expected)
  end

  def do_the_math(actual, expected)
    actual % expected == 0
  end
end

据我所知,ruby是一种脚本语言,编译器可以顺序读取代码。据说你必须在使用之前定义方法。但是在RSpec中,当我定义一个自定义匹配器时,我可以在调用它之后定义辅助方法。

我已经编写了测试代码来测试这样一个事实:如果我在定义它之前调用该方法它将会失败并且我还从RSpec读取了一些源代码,define方法实际上是define_method的包装并将委托传递为块。但我仍然无法理解这段代码的工作原理。

有人可以帮帮我吗?只是对这项工作的简要解释

1 个答案:

答案 0 :(得分:0)

简短的解释是:你还没有在那里调用这个方法,你只是在调用be_a_multiple_of匹配器时调用它,并且在发生这种情况时已经定义了该方法。

在声明方法或块时,解析器不检查方法是否已定义 - 因为该方法可能稍后定义,或者可能存在missing_method fall_back。