2008-11-28 75 views
11

如何將可變數量的參數傳遞給yield。 我不想傳遞一個數組(如下面的代碼所示),我實際上希望將它們作爲程序性參數傳遞給塊。如何以編程方式將參數傳遞給Ruby以產生?

def each_with_attributes(attributes, &block) 
    results[:matches].each_with_index do |match, index| 
    yield self[index], attributes.collect { |attribute| (match[:attributes][attribute] || match[:attributes]["@#{attribute}"]) } 
    end 
end 

回答

13

使用圖示運營商*打開數組參數。

block.call(*array) 

yield *array 
2

Asterisk會擴大一個數組個別論點紅寶石:

def test(a, b) 
    puts "#{a} + #{b} = #{a + b}" 
end 

args = [1, 2] 

test *args 
3

使用星號擴展陣列成單獨的成分在參數列表:

def print_num_args(*a) 
    puts a.size 
end 

array = [1, 2, 3] 
print_num_args(array); 
print_num_args(*array); 

會打印:

1 
3 

在第一種情況是數組通過,在第二種情況下,每個元素都是分開傳遞的。請注意,被調用的函數需要處理諸如print_num_args這樣的可變參數,如果它需要一個固定大小的參數列表並且接收到的數據多於或少於預期值,您將得到一個異常。

相關問題