2016-03-07 66 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

挽救生命,布魯 –