Что означает звездочка перед переменной в списке аргументов 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" .
Ответы
Ответ 1
*items
означает, что функция принимает переменное количество аргументов. Другими словами, если вы называете это следующим образом:
Order.by_items(item0, item1, item2)
переменная items
внутри именованной области лямбда-функции будет массивом с тремя элементами.
Чтобы ответить на ваш реальный вопрос, вы должны называть его следующим образом:
Order.by_items(*Item.find(:all, ...))