Применить метод к каждому элементу в массиве / enumerable - PullRequest
39 голосов
/ 27 июня 2011

Это мой массив:

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

Я хочу применить to_s метод ко всем моим элементам массива, чтобы получить array = ['one','two','three'].

Как это сделать (преобразованиекаждый элемент из перечисляемого чего-то еще)?

Ответы [ 4 ]

65 голосов
/ 27 июня 2011

Это будет работать:

array.map!(&:to_s)
16 голосов
/ 27 июля 2011

Стоит отметить, что если у вас есть массив объектов, которые вы хотите передать индивидуально в метод с другим вызывающим объектом, например:

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

Вы можете использовать метод method в сочетании с блокомПоведение расширения для упрощения:

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

Если вы не знакомы, то, что делает method, инкапсулирует метод, связанный с символом, переданным ему в Proc, и возвращает его.Амперсанд расширяет этот Proc в блок, который довольно красиво передается в map.Возвращаемое значение map является массивом, и мы, вероятно, хотим отформатировать его немного лучше, поэтому join.

Предостережение заключается в том, что, как и в случае Symbol#to_proc, вы не можете передавать аргументывспомогательный метод.

16 голосов
/ 27 июня 2011

Вы можете использовать map или map! соответственно, первый вернет новый список, второй изменит список на месте:

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

>> array.map{ |x| x.to_s }
=> ["one", "two", "three"]
7 голосов
/ 27 июня 2011
  • array.map!(&:to_s) изменяет исходный массив на ['one','two','three']
  • array.map(&:to_s) возвращает массив ['one','two','three'].
...