2016-03-07 67 views
2

我需要编写一个方法,它需要一个未知数量的参数(因此* splat),但它通过了yields_with_args规范。有没有(*)splat参数在Ruby中传递多个参数的方法?

代码:

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 

它的工作原理,但它产生的是*图示创建数组:[1,2,3] VS 1,2,3,因此没有通过RSpec的。是否有另一种方式通过Ruby中的方法传递多个参数?

回答

6

替换

block.call(args) 

block.call(*args) 

啪有两个功能:收集参数的阵列中定义时,并分布在呼叫的阵列参数。这两者是相反的操作:如果你期望透明操作(三个参数进来,三个参数出去),你应该分发你收集的东西。

+1

挽救生命,布鲁 –