ruby - 在 rspec 上下文中解释 procs 的用法

标签 ruby rspec proc

这是一个使用自定义 RSpec 匹配器 yield_variables 的期望:

specify { expect{ |p| [3,4,5].my_each(&p) }.to yield_variables [3,4,5] }

我的 yield_variables 匹配器的匹配项?方法使用一个名为 Probe 的自定义类(Probe 是 RSpec 的 yield probe 的精简版):

...
    def matches? block
        ap Probe.probe block
        # note i am inspecting what is returned by Probe.probe with ap
    end
...


# Probe class is what all my questions are about!
class Probe
    attr_accessor :yielded_args
    def initialize
        self.yielded_args = []
    end

    def self.probe(block)
        probe = new
        block.call(probe)
        probe.yielded_args
    end

    def to_proc
        Proc.new { |*args| yielded_args << args }
    end
end

现在我的 ap inside matches? 报告:[3,4,5] 这正是我所期望的。但是,我不知道 Probe 类是如何工作的!!

问题 1) 比赛? block

通常,我们传递给匹配的参数?是我们期望主题返回的内容。即,我希望 [3,4,5] 被传递到 block 中。 相反,|p| [3,4,5].my_each(&p) 作为过程传递到 block 中。这是为什么?

问题 2) block.call(probe)

我对 procs 不太了解所以请慢慢解释。但基本上,在这里我们采用我的 Probe 类的一个新实例并将 block “发送”给它,作为参数。这就是我尽我所能解释它的方式,但我可能完全错了,所以请慢慢解释。

问题3) to_proc是怎么调用的?

.to_proc 到底是怎么自动调用的?我相信它是由 block.call(probe) 自动调用的。 to_proc 是和initialize 一样自动调用的方法吗?每当将类发送到 proc 时,它是否会自动调用? (顺便说一句,将类发送到 proc 的短语对我来说甚至没有 100% 的意义——请解释。 block 不再作为参数传递到类中。或者如果 block 作为参数传递block.call 语法感觉真的很奇怪和倒退)

问题 4) to_proc

to_proc 如何访问期望的主题,即 |p| [3,4,5].my_each(&p) ? Proc.new 的 *args 如何自动填充每个可能的 yield 参数,即使我只传入了 |p| ? Proc.new 如何与我的 my_each 一起循环,将我所有的参数递增地放入一个数组中? Proc.new 如何了解主题 |p| [3,4,5].my_each(&p)?如何??请解释,谢谢。

最佳答案

基于 block 的行进器与其他匹配器的工作方式略有不同。通常,如果对您感兴趣的表达式进行求值并将结果传递给您,您想做一些不可能的事情。

例如,raises_error 匹配器想要执行 block 本身以查看是否引发了正确的异常,而 change 匹配器想要评估之前和之后的一些其他表达式看看它是否以指定的方式改变。这就是为什么向您传递的是 block 而不是值。

您传递给 expect 的 block 采用 1 个参数并将其用作调用 my_each 的 block ,因此当您的 Probe.probe 方法调用该 block 时,它必须传递一些东西作为值(value)。您已经表述为“将 block 发送到 probe 实例”,但它是另一种方式:使用 probe 作为参数调用该 block 。

该 block 执行并调用my_each。这里的 pProbe 的实例。在参数前加上 & 告诉 ruby​​ 这个参数应该用作方法的 block (方法是 my_each)。如果参数还不是 proc ruby​​ 调用 to_proc 。这就是 Probe#to_proc 的调用方式

假设 my_each 的行为与普通 each 相似,它将调用它的 block (即 to_proc 的返回值)一次数组中的每个值。

通常情况下,您的匹配器会将 Probe.probe 的返回值与实际值进行比较。

关于ruby - 在 rspec 上下文中解释 procs 的用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31501671/

相关文章:

ruby - 正则表达式,查找包含但不以开头的字符串

javascript - 将 websocket 与 Thin 结合使用

ruby-on-rails - 保持模型记录和相关目录同步(与测试)

c - linux proc大小限制问题

ruby - rvm system-wide install : Warning! PATH 未正确设置

ruby 哈希.删除(:key) deleting copies and clones as well

mysql - ActiveRecord:一一连接多个数据库

ruby - 失败时 pretty-print 数组

namespaces - 在 Tcl 中查找命名空间的所有过程

ruby - WEBrick:mount_proc