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

Ter*_*ber 20 syntax ruby-on-rails

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

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

什么*item意思?当我打电话给它Item.find(:first, ...)时工作正常.如果我尝试使用集合进行调用,Item.find(:all, ...)则会失败.

从一个不同的SO问题,我知道签名应该是:

Order.by_items(item0, item1, ...)
Run Code Online (Sandbox Code Playgroud)

所以,我的问题还真是,我怎么把一个数组转换成一个逗号分隔的参数列表?

UPDATE0

来自Martin Fowler我了解到:

(在参数列表中使用"*"有助于处理ruby中的变量参数.在参数列表中*disks表示vararg.然后我可以将所有传入的磁盘称为名为"disks"的数组.如果我调用另一个带有"*disks"的函数,磁盘数组的元素作为单独的参数传入.)

UPDATE1

更多关于"splat"运算符.

小智 20

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

Order.by_items(item0, item1, item2)
Run Code Online (Sandbox Code Playgroud)

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

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

Order.by_items(*Item.find(:all, ...))
Run Code Online (Sandbox Code Playgroud)