Подтвердить что ты не робот

Что означает звездочка перед переменной в списке аргументов 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, ...)

Итак, мой вопрос в том, как я могу превратить Array в список аргументов, разделенных запятой?

UPDATE0

От Мартин Фаулер Я узнал:

(Использование "*" в списке аргументов помогает в работе с переменными аргументами в ruby. В списке аргументов * диски указывают на vararg. Затем я могу обратиться ко всем дискам, переданным в виде массива с именем "диски". Если я вызываю другую функцию с помощью "* дисков", элементы массива дисков передаются как отдельные аргументы.)

Update1

Подробнее о операторе "splat" .

4b9b3361

Ответ 1

*items означает, что функция принимает переменное количество аргументов. Другими словами, если вы называете это следующим образом:

Order.by_items(item0, item1, item2)

переменная items внутри именованной области лямбда-функции будет массивом с тремя элементами.

Чтобы ответить на ваш реальный вопрос, вы должны называть его следующим образом:

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