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

Что означает Post.all.map(&: id)?

Возможный дубликат:
Что означает map (&: name) в Ruby?

Post.all.map(&:id) 

вернет

 => [1, 2, 3, 4, 5, 6, 7, ................] 

Что означает map(&:id)? Особенно &.

4b9b3361

Ответ 1

Символ & используется для обозначения того, что следующий аргумент следует рассматривать как блок, заданный методу. Это означает, что если это еще не объект Proc, его метод to_proc будет вызываться, чтобы преобразовать его в один.

Таким образом, ваш пример приводит к чему-то вроде

Post.all.map(&:id.to_proc)

что, в свою очередь, эквивалентно

Post.all.map { |x| x.id }

Таким образом, он выполняет итерацию по коллекции, возвращаемой Post.all, и создает массив с результатом метода id, вызываемого для каждого элемента.

Это работает, потому что Symbol#to_proc создает Proc, который берет объект и вызывает метод с именем символа на нем. Он в основном используется для удобства, чтобы сохранить некоторую типизацию.

Ответ 3

Это принимает все объекты Post и создает массив с методом id, который вызывается на каждом из них.

Другими словами, для ActiveRecord это означает, что вы получаете массив с атрибутом id для всех объектов Post в вашей базе данных.

Ответ 4

Это трюк Ruby, который использует Ruby для преобразования динамического типа. Вы можете найти объяснение Символ # to_proc трюк здесь.