变量前面的星号在named_scope参数列表中的含义是什么?

时间:2009-11-10 21:04:58

标签: ruby-on-rails syntax

我有一个像这样的命名范围:

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中的变量参数。在参数列表中* disks表示vararg。然后我可以将所有传入的磁盘称为名为“disks”的数组。如果我用“* disks”调用另一个函数,则磁盘数组的元素将作为单独的参数传入。)

UPDATE1

更多关于the "splat" operator

1 个答案:

答案 0 :(得分:19)

*items表示该函数接受可变数量的参数。换句话说,如果你这样称呼它:

Order.by_items(item0, item1, item2)

命名范围内的变量items lambda函数将是一个包含3个项目的数组。

要回答真正的问题,您应该这样称呼它:

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