Ruby присоединяет массив строк с пробелом между двумя последними элементами

#ruby

#ruby

Вопрос:

В моем приложении Ruby 2.7 я хочу объединить массив строк, чтобы иметь одну строку, разделенную запятыми. Следующим образом:

 [company.name, company.street, company.zipcode, company.city]
=> ["Sanford, Reilly and Schmidt", "Hoffmannstr. 186", "84875", "Gebesee"]
 

Ожидаемый результат:

 ["Sanford, Reilly and Schmidt", "Hoffmannstr. 186", "84875 Gebesee"]
 

Очевидно, что для получения такого результата я могу поместить пустую строку между company.zipcode и company.city и в конце использовать .join(', ') метод, подобный этому:

 [company.name, company.street, company.zipcode   ' '   company.city].join(', ')
 

Но, честно говоря, этот код для меня вонючий, есть ли какой-нибудь лучший способ добиться того же результата?

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

1. Ну, один из способов сделать его менее «вонючим» — это не использовать для объединения строк. Вместо этого используйте интерполяцию [company.name, company.street, "#{company.zipcode} #{company.city}"].join(', ')

2. В драгоценном камне Facets есть множество интересных методов. Array#conjoin — один из них; он похож join , но более мощный. Это позволяет использовать второй аргумент (и / или блок): [1,2,3].conjoin(', ', ' and ') # =>"1, 2 and 3"

Ответ №1:

Используйте два join() вызова:

 [company.name, company.street, [company.zipcode, company.city].join(' ')].join(', ')
 

Этот метод предпочтительнее, если у вас есть непустой разделитель для объединения и / или аргумент массива. В вашем конкретном случае решение с помощью "#{...} #{...}" engineersmnky короче и понятнее.

Ответ №2:

 arr = [company.name, company.street, company.zipcode, company.city]
  #=> ["Sanford, Reilly and Schmidt", "Hoffmannstr. 186", "84875", "Gebesee"]
 
 arr[0..-3] << "%s %s" % arr[-2, 2]
  #=> ["Sanford, Reilly and Schmidt", "Hoffmannstr. 186", "84875 Gebesee"] 
 

или

 arr[0..-3] << arr[-2, 2].join(' ')
  #=> ["Sanford, Reilly and Schmidt", "Hoffmannstr. 186", "84875 Gebesee"] 
 

arr не изменяется.