有没有一种方法没有(*)splat参数在Ruby中传递多个参数?

时间:2016-03-07 02:28:36

标签: ruby rspec splat

我需要编写一个方法,它接受一个未知数量的参数(因此是* 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中的方法传递多个参数?

1 个答案:

答案 0 :(得分:6)

替换

block.call(args)

block.call(*args)

Splat有两个功能:在定义时收集数组的参数,并将数组分配给调用中的参数。这两个是反向操作:如果你期望透明操作(三个参数进入,三个参数出去),你应该分发你收集的内容。