Третий урок: Строки

Введение в Ruby [HEXLET]

Что такое строка

Строка по определению является упорядоченной последовательностью символов, расположенных МЕЖДУ ОГРАНИЧИТЕЛЬНЫМИ СИМВОЛАМИ. Проще говоря, в языке программирования Ruby строки принято оборачивать в кавычки. При этом совершенно не важно какие именно вы используете кавычки, двойные или ординарные.

Так как я верстальщик, то мне привычней двойные кавычки. На этом и остановлюсь 🙂

ВАЖНО учитывать что при выводе на экран при помощи методов print или puts, а так же при записи в файл, любой тип данных преобразуется к строке (явно или не явно).

Еще интересные факты про стоки

  • строки это универсальный тип данных.
  • Изначально, любой код программы является строкой.
  • Если работа со строками обходится без преобразования в массив, то программа по сути либо слишком простая, либо бесполезная 🙂

Не все кавычки одинаково полезны

У кавычек, как я узнал, есть свои названия:

  • «Двойные кавычки» называются программистская кавычка,
  • ‘Ординарные кавычки‘ называются Машинописный апостроф.

Трындец, не удивительно что их никто не запоминает и называют более простыми именами.

Но на разнице в названиях кавычек, различия не заканчиваются. Оказывается что у них разная специфика работы.

Строка в апострофах гарантирует, что в ней будет содержаться тот же текст, что и в коде программы, без изменений.

Строка в кавычках будет проходить предварительное преобразование. Будут раскрыты конструкции «вставка» и «специальный символ».

Из этого следует, что в двойные кавычки (программистские) можно вставлять не только текст но и специальные символы, например:

Давайте посмотрим, как выглядит код программиста, который использует только ленивые строки:

my_number = 18
my_array  = [1, 2, 3, 4]
puts 'Моё число = ' + my_number.to_s + ', а мой массив длины ' + my_array.size.to_s

Прикольно смотрится, правда? в программе используется арифметический оператор сложения, но так как мы работаем над объединением данных разного типа с последующим выводом на экран, требуется привести все данные к типу СТРОКА Соответственно мы используем метод приведения .to_s

Если бы мы использовали не апострофы, а программистские кавычки (капец какое длинное слово), то этот же код выглядел короче и проще — значит лучше!

my_number = 18
my_array  = [1, 2, 3, 4]
puts "Моё число = #{my_number}, а мой массив длины #{my_array.size}"

Как же круто! Главное не забыть как это работает.

Третий урок: Строки
И всё таки программистские кавычки мне больше нравятся.

Методы работы со строками

Строки умеют Преображать выходные данные, дополняя числовые данные. Но не стоит с этим заигрываться, потому что дополнять выходные данные полезно только перед выводом результатов на экран. В противном случае вы рискуете усложнить программу и получить неожиданный результат на выходе. Проще говоря, не вставляйте строки там, где результат не выводится на экран. Оставьте это на красивый финал.

Изученные ранее арифметические операции над числами можно применять и к строкам. Вот только работают они немного иначе.

Конкатенация строковых объектов и умножение

Для объединения строк (конкатенация) используется знак ПЛЮС (+), а если строка должна повторяться на экране, то входные данные можно просто умножить на нужное количество раз. Главное помнить, что умножать можно только на целое число.

Третий урок: Строки
Пример программы на умножения строки (повторения)

Подсчёт количества повторов строки на экране

Красивая программа у меня получилась. Но как проверить сколько раз вывелась строка? Мы же программисты. Мы должны знать точно сколько раз!

Для этого нам пригодится знак деления. По средствам не сложной конструкции мы сможем доработать программу и произвести расчёт.

Я пока не до конца понимаю как работают массивы, но как я узнал, смысл деления состоит в том, чтобы преобразовать строку в массив, разбив её по разделителю.

Третий урок: Строки
Программа отображает на экране данные 120 раз, после чего выводит данные — количество повторений этой фразы, выполненное на экране.

Честно сказать, при написании этой программы я столкнулся с недопониманием и некоторыми сюрпризами. например у меня не совпадало число итераций (повторов итоговой фразы) с параметром используемым при умножении. Проще говоря я прописывал 120 повторов, а в итоговой сумме мне показывало что их якобы 600.

Проблема возникала из за пробелов в строке 4. Я по привычке использовал там отступы. Как только я их удалил — расчёт стал совпадать с ожидаемым результатом.

Второй момент, который мне пока что непонятен — это преобразование в массив. В будущем я надеюсь более детально разобраться в этой теме, так как это важно.

Преобразование строки в массив

Для преобразования строки в массив отвечает метод .split. Этому методу нужно передать разделитель, по которому будет происходить деление строки на элементы.

Теперь у меня больше понимания по поводу механизма расчёта количества повторов из моей программы и почему изначально у меня считало неправильно.

Третий урок: Строки
Программа преобразования строки в массив с последующим отображением количества элементов.

Я существенно модифицировал предыдущую программу. Теперь она не путается в пробелах и считает корректно!

boy = "Юрка"
girl = "Диана"

family = "#{boy} + #{girl}=любовь!" + "__"
years = 77

test = family * years
step1 = test.split("__")
puts step1

puts step1.length

Длинна строки

Для вычисления (расчёта) длинны строки используется метод .size. При этом нумерация идет по символам, что вполне логично. Ну и начинается нумерация с нуля, а не с единицы. Я то это знаю, потому что уже вникал в программирование на JavaScript, но если изучать Ruby прям совсем с нуля, то такая нумерация может стать сюрпризом 🙂

Третий урок: Строки
Практический пример применения метода .size для подсчёта количества символов в строке.

При работе со строками следует помнить, что пробел — это тоже символ и он идёт в счёт! А вот кавычки и апострофы не входят в общее число символов строки. Они являются ограничителями, и не более того.

Получение подстрок

Я разобрался как посчитать количество символов и теперь могу работать с этими данными. К примеру я могу выбирать нужные мне символы и выводить их на экран — это называется работа с подстроками.

Итак, я теперь знаю, что первый символ имеет порядковый номер 0 и дальше символы в порядке исчисления до конца.

Третий урок: Строки
Пример работы с подстроками в Ruby.

Обратите внимание что если при работе с подстроками у начале указать троеточие, то за точку отсчёта берётся нулевой символ строки. Это ожидаемо и логично!

Для получения подстроки или символа из строки необходимо всегда указывать диапазон. Даже если в диапазоне всего один элемент. Что бы получить только один единственный символ — передайте диапазон состоящий из одного номера.

Строка наоборот

Я всегда любил читать слова задом на оборот. В Ruby тоже так можно. Давайте напишем программу, которая будет коверкать наш текст, а потом внедрим её на сайте заказчика, который нам не заплатил 🙂

за коверкание строковых объектов в Ruby отвечает метод .reverse. Не стоит путать метод .reverse для массивов с методом .reverse для строк. В массивах меняется порядок элементов, а в строках — символов. Надеюсь я об этом не забуду в дальнейшем и не буду тупить при написании программ.

Третий урок: Строки
Применение метода .reverse для вывода строки наоборот.

Замена данных в строке

При работе с подстроками мы можем делать подмену конкретных символов или сочетаний. Для этого мы используем методы .sub и .gsub. Они оба меняют символы и сочетания, с небольшим отличием:

  • .sub — производит замену заданного значения один раз
  • .gsub — заменяем все возможные значения в строке.
Третий урок: Строки
Пример использования методов замены символов и сочетаний при работе с подстрокой в Ruby.

Резюмируем

Строки, как и все в языке Ruby — это объекты.

Срока состоит из символов и ограничителей — кавычек или апострофов.

При работе со строками можно использовать арифметические операторы, но они работают не так как с цифрами:

  • плюс — складывает строки вместе (склейка, конкатенация, объединение)
  • умножение позволяет повторять строку сколько угодно раз при выводе на экран.

При работе с объектом «Строка» применяются следующие методы:

  • .split — преобразование строки в массив (явное преобразование объекта «Строка» в объект «Массив»)
  • .size — определение длинны строки (кол-во символов в строке). Пробел — тоже символ
  • .reverse — отзеркаливание строки — задом наперёд
  • .sub и .gsub — заменяем символов в строке (работа с подстроками)

Это далеко не все что могут строки, а лишь базовые аспекты и методы. В дальнейшем буду изучать более основательно. там затрону такие фичи, как работа с правилами, квантификаторами и классами. Пока что я не буду распыляться, а то запутаюсь.

Полезные ссылки

Юрий Ронин