Ruby元编程,RSpec';s';应该';工作
我在阅读RSpec,我试图弄清楚RSpec的“应该”是如何实现的 有人能帮忙解释一下这个函数的元本质是如何工作的吗 代码位于此处: 蒂亚 -丹尼尔 澄清:Ruby元编程,RSpec';s';应该';工作,ruby,metaprogramming,rspec,Ruby,Metaprogramming,Rspec,我在阅读RSpec,我试图弄清楚RSpec的“应该”是如何实现的 有人能帮忙解释一下这个函数的元本质是如何工作的吗 代码位于此处: 蒂亚 -丹尼尔 澄清: target.should == 5 目标值是如何传递给“应该”的,而“应该”又是与5相对的“==”d?看看 这一切归结为Ruby,它允许您省略句点和括号。你真正写的是: target.should.send(:==, 5) 也就是说,将消息should发送到对象target,然后将消息=发送到should返回的任何对象 方法应该被猴子
target.should == 5
目标值是如何传递给“应该”的,而“应该”又是与5相对的“==”d?看看
这一切归结为Ruby,它允许您省略句点和括号。你真正写的是:
target.should.send(:==, 5)
也就是说,将消息should
发送到对象target
,然后将消息=
发送到should
返回的任何对象
方法应该
被猴子补丁到内核
,因此它可以被任何对象接收。由返回的匹配器
应该
保存实际
,在本例中是目标
Matcher
实现了方法==
,该方法与预期的
进行比较,在本例中,预期的是数字5。您可以自己尝试的简化示例:
module Kernel
def should
Matcher.new(self)
end
end
class Matcher
def initialize(actual)
@actual = actual
end
def == expected
if @actual == expected
puts "Hurrah!"
else
puts "Booo!"
end
end
end
target = 4
target.should == 5
=> Booo!
target = 5
target.should == 5
=> Hurrah!
感谢您提供了一个很好的小解释,它不仅回答了这个问题,而且是Ruby中一些机制的一个很好的总结。对于Ruby新手来说,要知道函数中的最后一个表达式是隐式的返回值,所以上面C++中的Matter *内核应该是::应该():{返回新匹配器(this);}:非常好的答案,非常感谢!两个快速观察:您可以在类对象上定义“应该”,而不是在内核模块上定义“应该”。我觉得它更安全,因为它不太通用。第二件事是不需要元编程来定义方法==。您可以将其定义为任何其他常规方法,以便更容易阅读:def==(预期)谢谢@Nicholas,我已经用您的建议更新了我的答案。