В ruby у строки есть метод split
, который делает из неё массив строк. Этот метод очень популярен среди ruby-разработчиков, т.к. с его помощью можно творить чудеса.
Представьте, что у вас есть строка с описанием расхода (дата покупки, что купили, категория, сколько стоило) и вам надо получить из неё только стоимость.
> expense = '29.11.2022;Крупа манная;Продукты;55.00'
> expense.split(';')
=> ["29.11.2022", "Крупа манная", "Продукты", "55.00"]
> expense.split(';').last
=> "55.00"
В качестве параметра метод split
принимает разделитель — строка из одного или нескольких символов, встретив которые метод будет понимать, что закончился один элемент массива и начался второй.
Разделитель по умолчанию (если методу ничего не передать) — пробел:
> name = 'Головкин Евгений Геннадьевич'
> name.split
=> ["Головкин", "Евгений", "Геннадьевич"]
Как уже упоминалось, в качестве разделителя может быть несколько символов.
> string = 'Курица, Сыр, Масло, Гречка, Клубника'
> string.split(', ')
=> ["Курица", "Сыр", "Масло", "Гречка", "Клубника"]
С помощью метода split
можно разбить слово (или строку) на буквы, передав в качестве разделителя пустую строку.
> word = 'конституционный'
> word.split('')
=> ["к", "о", "н", "с", "т", "и", "т", "у", "ц", "и", "о", "н", "н", "ы", "й"]
Однако, для этого есть более простой способ — метод chars
(им и стоит пользоваться).
> word = 'филолог'
> word.chars
=> ["ф", "и", "л", "о", "л", "о", "г"]
Если строка кончается разделителем (одним или несколькими), пустая строка в качестве элемента в конец массива добавлена не будет.
> numbers = '1.55;2.35;5.48;3.40;;'
> numbers.split(';')
=> ["1.55", "2.35", "5.48", "3.40"]
Если в качестве разделителя используется пробел, пробел в начале строки также не добавит пустой строки в массив, а несколько пробелов подряд внутри строки будут расценены как один.
> sentence = ' В коридоре происходило что-то непонятное'
> sentence.split
=> ["В", "коридоре", "происходило", "что-то", "непонятное"]
С другими разделителями такое дерьмо не прокатит:
> expense = '29.11.2022;Куриная грудка;;238.00'
> expense.split(';')
=> ["29.11.2022", "Куриная грудка", "", "238.00"]
Если хотите такое же «честное» разбиение для пробела — в качестве разделителя можно передать пробел не строкой, а регулярным выражением.
> sentence = ' В коридоре кто-то стоял'
> sentence.split(/ /)
=> ["", "В", "коридоре", "", "кто-то", "", "стоял"]
Ну и напоследок, если вы хотите, чтобы, начиная с какого-то элемента, остаток строки был записан в массив полностью, можно передать лимит элементов вторым параметром:
> expense = '29.11.2022;Люля-кебаб;Продукты;4.37;Я прощаю тебе;Те четыре рубля;...'
> expense.split(';', 5)
=> ["29.11.2022", "Люля-кебаб", "Продукты", "4.37", "Я прощаю тебе;Те четыре рубля;..."]
Метод join
в ruby нужен, чтобы наоборот, склеить элементы массива в одну строку. В качестве аргумента он тоже принимает разделитель, который будет вставлен между соседними элементами.
> param_with_value = ['vacancyId', '71781925']
> param_with_value.join('=')
=> "vacancyId=71781925"
Так можно собрать отдельные строки для записи, например, в файл.
> lines = ['Я волком бы', 'выгрыз', 'бюрократизм.', 'К мандатам', 'почтения нету.']
> lines.join("\n")
=> "Я волком бы\nвыгрыз\nбюрократизм.\nК мандатам\nпочтения нету."
> puts lines.join("\n")
Я волком бы
выгрыз
бюрократизм.
К мандатам
почтения нету.
Если элементы массива — не строки, перед «склеиванием» они будут переведены в строки (под капотом у каждого элемента, не являющегося строкой, будет вызван метод to_s
).
> numbers = [3, 5, 10, 2.4, 1]
> numbers.join(' - ')
=> "3 - 5 - 10 - 2.4 - 1"
А так можно собрать из хэша с параметрами query-строку для запроса.
> params = {sort: 'MostFrequent', filters: 'NoAnswers', edited: true}
> params.map { _1.join('=') }.join('&')
=> "sort=MostFrequent&filters=NoAnswers&edited=true"
Делать этого, конечно, не стоит, потому что в руби для этого есть специальный метод.
URI.encode_www_form(params)
=> "sort=MostFrequent&filters=NoAnswers&edited=true"
Когда в следующий раз в ruby вам надо будет обработать строку с разделителями или склеить в одну строку элементы массива, вспоминайте про этого тянитолкая, методы split
и join
.