Метод split в ruby

В 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 в руби

Метод 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.

Изучаешь руби?

Заходи в дружелюбный чат, задавай вопросы, делись опытом.

Присоединиться