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

Применить метод к каждому элементу в массиве/перечисляемом

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

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

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

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

4b9b3361

Ответ 1

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

array.map!(&:to_s)

Ответ 2

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

# 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, вы не можете передавать аргументы вспомогательному методу.

Ответ 3

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

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

>> array.map{ |x| x.to_s }
=> ["one", "two", "three"]

Ответ 4

  • array.map!(&:to_s) изменяет исходный массив на ['one','two','three']
  • array.map(&:to_s) возвращает массив ['one','two','three'].