Что означает звездочка перед переменной в списке аргументов named_scope? - PullRequest
18 голосов
/ 11 ноября 2009

У меня есть именованная область видимости, подобная этой:

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

С Мартин Фаулер Я выучил:

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

Update1

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

1 Ответ

19 голосов
/ 11 ноября 2009

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

Order.by_items(item0, item1, item2)

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

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

Order.by_items(*Item.find(:all, ...))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...