Возможный дубликат:
Что означает map (&: name) в Ruby?
Post.all.map(&:id)
вернет
=> [1, 2, 3, 4, 5, 6, 7, ................]
Что означает map(&:id)
? Особенно &
.
Возможный дубликат:
Что означает map (&: name) в Ruby?
Post.all.map(&:id)
вернет
=> [1, 2, 3, 4, 5, 6, 7, ................]
Что означает map(&:id)
? Особенно &
.
Символ &
используется для обозначения того, что следующий аргумент следует рассматривать как блок, заданный методу. Это означает, что если это еще не объект Proc, его метод to_proc
будет вызываться, чтобы преобразовать его в один.
Таким образом, ваш пример приводит к чему-то вроде
Post.all.map(&:id.to_proc)
что, в свою очередь, эквивалентно
Post.all.map { |x| x.id }
Таким образом, он выполняет итерацию по коллекции, возвращаемой Post.all
, и создает массив с результатом метода id
, вызываемого для каждого элемента.
Это работает, потому что Symbol#to_proc
создает Proc, который берет объект и вызывает метод с именем символа на нем. Он в основном используется для удобства, чтобы сохранить некоторую типизацию.
& означает, что вы передаете блок
Post.all - это приемник метода .map, и его блок передается на
Post.all.map { |item| # do something }
http://ruby-doc.org/core-1.9.3/Enumerable.html#method-i-map
Он выполняет итерацию по массиву и создает лямбда с символом # to_proc
Это принимает все объекты Post
и создает массив с методом id
, который вызывается на каждом из них.
Другими словами, для ActiveRecord это означает, что вы получаете массив с атрибутом id
для всех объектов Post
в вашей базе данных.
Это трюк Ruby, который использует Ruby для преобразования динамического типа. Вы можете найти объяснение Символ # to_proc трюк здесь.