2009-11-10 53 views
17

我有一個名爲範圍是這樣的:named_scope參數列表中的變量平均值之前的星號是什麼?

named_scope :by_items, lambda |*items| { 
    :joins => :items, 
    :conditions => ["items.id in (?)", items.map(&::id)] 
} 

什麼的*item是什麼意思?當我與Item.find(:first, ...)通話時,它工作正常。如果我嘗試使用集合,Item.find(:all, ...)它失敗。

從不同的SO問題,我知道的簽名應該是:

Order.by_items(item0, item1, ...) 

所以,我的問題真的是,我怎麼把一個數組轉換成一個逗號分隔的參數列表?

UPDATE0

Martin Fowler我學到:

(使用「*」的參數列表與Ruby的變量參數的工作有助於在參數列表*盤指示然後我可以參考所有以「磁盤」數組形式傳入的磁盤,如果我使用「*磁盤」調用另一個函數,則磁盤數組的元素將作爲單獨的參數傳入。)

UPDATE1

更多關於the "splat" operator

回答

18

*items表示該函數接受可變數量的參數。換句話說,如果你這樣稱呼它:

Order.by_items(item0, item1, item2) 

命名範圍lambda函數內部變量items將與3個項目的數組。

要回答你的真正的問題,你應該這樣稱呼它:

Order.by_items(*Item.find(:all, ...)) 
+1

這就是神奇! – 2009-11-10 21:32:47