Ответ 1
Это будет работать:
array.map!(&:to_s)
Это мой массив:
array = [:one,:two,:three]
Я хочу применить метод to_s
ко всем моим элементам массива, чтобы получить array = ['one','two','three']
.
Как я могу это сделать (преобразование каждого элемента перечислимого в другое)?
Это будет работать:
array.map!(&:to_s)
Стоит отметить, что если у вас есть массив объектов, которые вы хотите передать индивидуально в метод с другим вызывающим, например:
# 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
, вы не можете передавать аргументы вспомогательному методу.
Вы можете использовать map
или map!
соответственно, первый вернет новый список, второй изменит список на месте:
>> array = [:one,:two,:three]
=> [:one, :two, :three]
>> array.map{ |x| x.to_s }
=> ["one", "two", "three"]
array.map!(&:to_s)
изменяет исходный массив на ['one','two','three']
array.map(&:to_s)
возвращает массив ['one','two','three']
.