Где возможно, я предпочитаю модифицировать строки на месте, а не преобразовывать их в массивы, модифицировать массив и затем объединять результаты обратно в строку (возможно, foible ).Кроме того, в 2018 году мы не должны поддерживать Unicode? 1
def capitalize_then_upcase(str)
str.gsub(/\p{Alpha}+/).with_index { |s,i| i.zero? ? s.capitalize : s.upcase }
end
arr = ['JohN di Bello', 'Hopalong Cassidy', 'Franz Josef Strauß']
arr.map { |str| capitalize_then_upcase(str) }
#=> ["John DI BELLO", "Hopalong CASSIDY", "Franz JOSEF STRAUSS"]
При этом используется форма String # gsub , где перечислитель возвращается при наличиинет блока.
\p{Alpha}
можно заменить на [[:alpha:]]
.Обе соответствуют буквам Юникода (прописные и строчные).Для получения документации ищите их как строки в Regexp .
1.См. эту статью , касающуюся String # upcase (и предположительно String # прописные буквы ) поддержки Unicode.