2

我需要编写一个方法,它接受未知数量的参数(因此是 *splat),但它通过了一个yields_with_args规范。

编码:

def eval_block(*args, &block)
    raise "NO BLOCK GIVEN!" if block.nil?
       block.call(args)
end

rspec:

it "passes the arguments into the block" do
      expect do |block|
        eval_block(1, 2, 3, &block)
      end.to yield_with_args(1, 2, 3)
    end
end

它可以工作,但它会产生 *splat 创建的数组:[1,2,3]vs 1,2,3,因此不会通过 rspec。还有另一种方法可以通过 Ruby 中的方法传递多个参数吗?

4

1 回答 1

6

代替

block.call(args)

block.call(*args)

Splat 有两个功能:在定义时将参数收集到数组中,以及在调用中将数组分配给参数。两者是逆操作:如果您期望透明操作(三个参数输入,三个参数输出),您应该分发您收集的内容。

于 2016-03-07T02:32:22.520 回答