#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
, что это сокращение для блока с одним вызовом метода.