Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby元编程,RSpec';s';应该';工作_Ruby_Metaprogramming_Rspec - Fatal编程技术网

Ruby元编程,RSpec';s';应该';工作

Ruby元编程,RSpec';s';应该';工作,ruby,metaprogramming,rspec,Ruby,Metaprogramming,Rspec,我在阅读RSpec,我试图弄清楚RSpec的“应该”是如何实现的 有人能帮忙解释一下这个函数的元本质是如何工作的吗 代码位于此处: 蒂亚 -丹尼尔 澄清: target.should == 5 目标值是如何传递给“应该”的,而“应该”又是与5相对的“==”d?看看 这一切归结为Ruby,它允许您省略句点和括号。你真正写的是: target.should.send(:==, 5) 也就是说,将消息should发送到对象target,然后将消息=发送到should返回的任何对象 方法应该被猴子

我在阅读RSpec,我试图弄清楚RSpec的“应该”是如何实现的

有人能帮忙解释一下这个函数的元本质是如何工作的吗

代码位于此处:

蒂亚

-丹尼尔

澄清:

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,我已经用您的建议更新了我的答案。