Как объединить целые числа с помощью запятой, не ставя запятую в конце

#ruby-on-rails #ruby

#ruby-on-rails #ruby

Вопрос:

Если я сделаю это:

 users.each do |u|
   str  = u.id.to_s   ','
end
  

В итоге я получу:

 1,3,234,234,
  

Существует ли стиль зацикливания, который не оставляет запятую ',' в конце? Я знаю, что могу chomp отключить это после цикла, но искал способ сделать это без необходимости делать это.

Ответ №1:

Или даже короче:

 users.map(amp;:id).join ','
  

Комментарии:

1. Да, я понял это, но потратил время на поиск #join перед вводом. Хороший улов.

2. @DanneManne Вообще не соответствует действительности. Существует практическая грань между «простотой» кода и «удобочитаемостью», которая слишком часто склоняется в сторону первого. Не хочу сказать, что вы пересеклись с этим конкретным решением, но в отношении вашего обобщенного комментария я был бы вынужден категорически не согласиться. Учитывая, что ваш ответ действительно помог мне, я соответствующим образом поддержал его. Спасибо!

Ответ №2:

 users.map { |u| u.id.to_s }.join ','
  

И на самом деле, #join сделаю #to_s это за вас, так что, поразмыслив:

 users.map(amp;:id).join ','
  

Комментарии:

1. можете ли вы немного объяснить, что делает map? amp;: идентификатор — это блок?

2. @Blankman: Посмотрите документацию для Symbol#to_proc . По сути, то, что он делает, эквивалентно { |u| u.id } .

3. Верно, в Ruby должен быть FAQ для легко пропущенных местоположений документов API. amp; всегда заключается в превращении блока в процесс, или, как в данном случае, процесса в блок. amp; Операция попытается преобразовать любой аргумент, не относящийся к proc, в proc с #to_proc. Как это бывает, если вы посмотрите class Symbol в документах core API, вы найдете #to_proc , что это сокращение для блока с одним вызовом метода.