web-dev-qa-db-fra.com

Appliquer la méthode à chaque élément du tableau / énumérable

Voici mon tableau:

array = [:one,:two,:three]

Je souhaite postuler to_s méthode à tous mes éléments de tableau pour obtenir array = ['one','two','three'].

Comment puis-je faire cela (convertir chaque élément de l'énumérable en quelque chose d'autre)?

39
Vladimir Tsukanov

Cela fonctionnera:

array.map!(&:to_s)
65
sawa

Il convient de noter que si vous disposez d'un tableau d'objets, vous souhaitez passer individuellement dans une méthode avec un appelant différent, comme ceci:

# erb
<% strings = %w{ cat dog mouse rabbit } %>
<% strings.each do |string| %>
  <%= t string %>
<% end %>

Vous pouvez utiliser la méthode method associée au comportement d'expansion des blocs pour simplifier:

<%= strings.map(&method(:t)).join(' ') %>

Si vous n'êtes pas familier, ce que method fait est encapsule la méthode associée au symbole qui lui est passé dans un Proc et le renvoie. L'esperluette étend ce Proc en un bloc, qui est très bien passé à map. Le retour de map est un tableau, et nous voulons probablement le formater un peu mieux, d'où le join.

La mise en garde est que, comme avec Symbol#to_proc, vous ne pouvez pas passer d'arguments à la méthode d'assistance.

16
coreyward

Vous pouvez utiliser map ou map! respectivement, le premier retournera une nouvelle liste, le second modifiera la liste sur place:

>> array = [:one,:two,:three]
=> [:one, :two, :three]

>> array.map{ |x| x.to_s }
=> ["one", "two", "three"]
16
miku
  • array.map!(&:to_s) modifie le tableau d'origine en ['one','two','three']
  • array.map(&:to_s) renvoie le tableau ['one','two','three'].
7
Arun Kumar Arjunan