web-dev-qa-db-fra.com

Que signifie Post.all.map (&: id)?

Duplicata possible:
Que signifie la carte (&: nom) dans Ruby?

Post.all.map(&:id) 

reviendra

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

Que signifie map(&:id)? Surtout le &.

42
hey mike

Le symbole & Est utilisé pour indiquer que l'argument suivant doit être traité comme le bloc donné à la méthode. Cela signifie que si ce n'est pas encore un objet Proc, sa méthode to_proc Sera appelée pour le transformer en un.

Ainsi, votre exemple se traduit par quelque chose comme

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

qui à son tour équivaut à

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

Il parcourt donc la collection retournée par Post.all Et construit un tableau avec le résultat de la méthode id appelée sur chaque élément.

Cela fonctionne parce que Symbol#to_proc crée un Proc qui prend un objet et appelle la méthode avec le nom du symbole dessus. Il est principalement utilisé pour plus de commodité, pour économiser de la frappe.

81
Niklas B.

& signifie que vous passez un bloc

Post.all est le récepteur de la méthode .map, et son bloc est transmis

Post.all.map { |item| # do something }

http://Ruby-doc.org/core-1.9.3/Enumerable.html#method-i-map

Il parcourt le tableau et crée un lambda avec le symbole # to_proc

http://Ruby-doc.org/core-1.9.3/Symbol.html#method-i-to_proc

5
Andre Dublin

Cela prend tous les objets Post et crée un tableau avec la méthode id appelée sur chacun d'eux.

En d'autres termes, pour ActiveRecord, cela signifie que vous obtenez un tableau avec l'attribut id pour toutes les entités Post dans votre base de données.

2
Platinum Azure

C'est une astuce Ruby, qui repose sur Ruby faisant une conversion de type dynamique. Vous pouvez trouver une explication de l'astuce Symbol # to_proc ici) .

1
0x4a6f4672