Как работать со строками в Ruby

Вступление

String - это последовательность из одного или нескольких символов, которая может состоять из букв, цифр или символов.

Strings in Ruby являются объектами, и в отличие от других языков, строки являются mutable, что означает, что их можно изменить на месте вместо создания новых строк.

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

В этом руководстве вы узнаете, как работать со строками в Ruby. Вы будете создавать строки, отображать их на экране, сохранять их в переменных, объединять несколько строк и узнавать, как обрабатывать специальные символы, такие как символы новой строки, апострофы и двойные кавычки.

Создание и печать строк

Строки существуют либо в одинарных кавычках + '+, либо в двойных кавычках `+" + `в Ruby, поэтому для создания строки заключите последовательность символов в один или другой:

'This is a string in single quotes.'

"This is a string in double quotes."

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

Чтобы отобразить строку в вашей программе, вы можете использовать метод + print +:

print "Let's print out this string."

Метод + print + отображает строку в точности как написано.

Попробуйте это. Create новая программа на Ruby под названием + print.rb + с помощью текстового редактора и используйте `+ print + `распечатать три строки:

print.rb

print 'This is the first string.'
print 'This is the second string.'
print 'This is the third string.'

Сохраните файл и запустите программу:

ruby print.rb

Вы увидите следующий вывод:

OutputThis is the first string.This is the second string.This is the third string.

Вместо трех строк, напечатанных в их собственных строках, все три строки были напечатаны вместе в одной строке. Метод + print + выводит строку на экран, но если вы хотите, чтобы каждая строка была отдельной строкой, вам нужно было бы добавить символ переноса строки самостоятельно.

Если вы хотите, чтобы все три строки были в отдельных строках, используйте вместо этого метод + put +. Измените вашу программу так, чтобы она использовала + put вместо` + print`:

print.rb

'This is the first string.'
'This is the second string.'
'This is the third string.'

Теперь снова запустите программу, и вы увидите следующее:

OutputThis is the first string.
This is the second string.
This is the third string.

Метод + + + выводит указанную вами строку, но также добавляет символ новой строки в конец строки.

Хранение строк в переменных

Variables - это именованная ссылка на место в памяти компьютера. Вы используете переменные для хранения данных и получения их позже.

Чтобы сохранить строку в переменной, определите имя переменной и присвойте значение строки:

my_string = 'This is my string'

Затем, чтобы получить значение, используйте имя переменной:

print my_string

Чтобы проверить это самостоятельно, создайте файл + string_variables.rb + в своем редакторе и добавьте следующий код:

string_variables.rb

my_name = "Sammy the Shark"
my_age = "none of your business"

puts my_name
puts my_age

Эта программа определяет две переменные: + my_name + и my_age. Каждой переменной присваивается строка. Затем мы используем метод + put +, чтобы распечатать каждую строку в отдельной строке.

Сохраните файл и запустите программу:

ruby string_variables.rb

Вы увидите следующий вывод:

OutputSammy the Shark
none of your business

Присваивая строки переменным, вы можете избежать повторного ввода одной и той же строки каждый раз, когда захотите ее использовать, упрощая работу со строками в ваших программах и манипулирование ими.

Давайте посмотрим, как объединить строки, чтобы создать новые строки.

Конкатенация строк

Concatenation означает объединение двух или более строк вместе для создания новой строки. Для конкатенации мы используем оператор конкатенации, представленный символом . Символ `` также является оператором сложения при использовании с арифметическими операциями.

Вот как вы объединяете строки + sammy + и + shark + вместе:

"sammy" + "shark"

Это даст следующий результат:

Outputsammyshark

Конкатенация объединяет строки в конец, объединяя их и выводя новое строковое значение. Если вы хотите иметь пробел между словами + sammy + и + shark +, вы должны включить этот пробел в одну из строк, например так:

"sammy " + "shark"

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

Вот пример:

color = "Blue"
print "My favorite color is " + color

Это приведет к выводу + Мой любимый цвет синий +. Обратите внимание, что мы оставили пробел после слова + is + в строке, чтобы в выводе был пробел между строкой и значением переменной в выводе.

Таким образом, вы можете объединить несколько строк вместе. Создайте файл + concatenation.rb + и добавьте этот код:

concatenation.rb

my_name = "Sammy the Shark"
my_age = "none of your business"

puts "My name is " + my_name + " and my age is " + my_age + "."

Эта программа определяет две переменные: + my_name + и + my_string +, каждая из которых имеет собственную назначенную строку, как вы делали раньше. Но на этот раз, вместо того, чтобы печатать значения, мы печатаем строку, которая использует конкатенацию, чтобы напечатать эти значения с некоторым дополнительным контекстом.

Когда вы запустите эту программу, вы увидите следующий вывод:

OutputMy name is Sammy the Shark and my age is none of your business.

В этой маленькой программе вы использовали конкатенацию для вставки переменных в эту строку.

Когда вы объединяете две или более строк посредством конкатенации, вы создаете новую строку, которую вы можете использовать в своей программе, поэтому вы можете назначить созданную вами строку новой переменной, которую вы сможете использовать позже:

concatenation.rb

my_name = "Sammy the Shark"
my_age = "none of your business"

# assign concatenated string to variable
output = "My name is " + my_name + " and my age is " + my_age + "."

# Print the output.
puts output

В такой маленькой программе, как эта, использование дополнительной переменной + output +, вероятно, не нужно. Но в более крупных программах вы можете создать строку с использованием конкатенации, которую вы будете использовать в нескольких местах. Хорошей привычкой также является разделение обработки данных, таких как конкатенация и арифметика, от вывода, так как в конечном итоге ваши программы станут больше, и вы захотите разделить логику и выходные данные на отдельные файлы или компоненты, чтобы упростить управление ими.

Не используйте оператор + между двумя разными типами данных. Например, вы не можете объединять строки и целые числа вместе.

Чтобы увидеть, что происходит, создайте новую программу под названием + strings_and_integers.rb + со следующим содержимым:

strings_and_integers.rb

my_name = "Sammy the Shark"
my_number = 27

print my_name + my_number

На этот раз у нас есть + my_name +, которая содержит строку + Sammy the Shark + и + my_number +, которая содержит целое число + 27 +. Мы знаем, что + 27 + не является строкой, потому что она заключена в кавычки. У него также нет десятичной точки, поэтому мы знаем, что это целое число.

Если вы запустите программу:

ruby strings_and_ints.rb

Вы увидите это сообщение об ошибке:

Outputstrings_and_ints.rb:4:in `+': no implicit conversion of Integer into String (TypeError)
   from strings_and_ints.rb:4:in `<main>'

Ошибка + нет неявного преобразования Integer в String + означает, что Ruby может только объединить строку в существующую строку.

Мы могли бы изменить нашу программу и поместить число` + 27 + в кавычки ( + "27" + `), чтобы оно объявлялось как строка вместо целого числа. Или мы можем преобразовать число в строку при создании строки, например так:

strings_and_integers.rb

my_name = "Sammy the Shark"
my_number = 27

print my_name + my_number

Метод + .to_s + преобразует целое число в строку. Это лучший подход, так как он позволяет нам сохранить наше число как целое число в нашей программе. Нам нужно, чтобы она была строкой, когда мы ее распечатываем, но мы можем захотеть, чтобы она была целым числом, если мы должны использовать ее в других частях нашей логики программы.

Запустите программу еще раз, и вы увидите «+ Sammy the Shark27 +», напечатанное на экране.

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

Конкатенация является мощной, но это может быть сложно. Если вы случайно пропустите один из операторов +, вы можете получить синтаксическую ошибку. И если вам нужно объединить строки с переменными, содержащими числа, вы должны преобразовать переменные в строки. Ruby предоставляет другой способ вставки значений переменных в строку, называемый string interpolation, который решает обе эти проблемы.

Использование строковой интерполяции

При объединении строк и переменных вывод может быть трудным для чтения и отладки. Строковая интерполяция решает эту проблему, позволяя вам вставлять выражения в строку, заключенную в двойные кавычки.

Вместо того чтобы писать это:

"My name is " + my_name + "!"

Вы можете сделать это:

"My name is #{my_name}!"

Вместо завершения строки и использования оператора + вы заключаете переменную с синтаксисом + # {} +. Этот синтаксис говорит Ruby вычислить выражение и вставить его в строку.

Попробуйте это. Создайте новую программу с именем + interpolation.rb + и добавьте этот код:

interpolation.rb

my_name = "Sammy the Shark"
my_age = "none of your business"

output = "My name is #{my_name} and my age is #{my_age}."

puts output

Это та же самая программа, которую вы уже написали, но на этот раз мы используем интерполяцию строк для создания выходных данных.

Строковая интерполяция имеет еще одно преимущество: она может автоматически преобразовывать числовые значения в строки. Помните вашу программу + strings_and_integers.rb +? Снова откройте этот файл в редакторе, но измените последнюю строку, чтобы она выглядела следующим образом:

strings_and_integers.rb

my_name = "Sammy the Shark"
my_number = 27

# use interpolation instead of concatenation
print "My name is #{my_name} and my favorite number is #{my_number}."

Ruby автоматически преобразует + my_number + в строку, и ваша программа выведет следующий вывод при его запуске:

OutputMy name is Sammy the Shark and my favorite number is 27.

Строковая интерполяция мощная и удобная. Это также предпочтительный метод для объединения строк с переменными.

Строковые литералы и строковые значения

Обратите внимание, что все созданные вами строки заключены в кавычки в коде, но фактический вывод на печать не включает кавычки.

Существует различие при обращении к каждому из них. String literal - это строка в том виде, в каком она написана в исходном коде, включая цитаты. String value это то, что вы видите в выводе, и не включает в себя цитаты.

Это строковый литерал:

"Sammy the Shark"

Строковым значением будет + Sammy the Shark.

В большинстве случаев вам не придется беспокоиться об этой разнице, если только вы не хотите использовать специальные символы, такие как кавычки или апострофы в своих строках.

Кавычки и апострофы в строках

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

Если вы попытаетесь использовать апостроф в середине строки в одинарных кавычках, вот так:

'This isn't what I wanted.'

Апостроф в + not + завершает строку, как вы можете видеть из странного выделения в этом примере. В результате интерпретатор Ruby попытается проанализировать оставшуюся часть предполагаемой строки как код, и вы получите ошибку.

Вы бы попали в ту же ситуацию, если бы использовали двойные кавычки в строке, заключенной в двойные кавычки:

"Sammy says, "Hello!""

В этом примере закрывающая двойная кавычка перед + Hello + завершает строку, а двойная кавычка после + Hello! + Создает новую строку, которая не имеет совпадающей двойной кавычки для ее завершения, поэтому Ruby будет отобразить ошибку.

Чтобы избежать этой проблемы, у вас есть несколько вариантов. Во-первых, вы можете использовать альтернативный синтаксис для создания строк; если вам нужно использовать двойные кавычки в строке, используйте одинарные кавычки для определения строки, и наоборот. Вы можете также escape кавычки, или вы можете использовать другой синтаксис Ruby для определения строк. Давайте посмотрим на каждый подход.

Вариант 1. Используйте синтаксис альтернативной строки

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

Вместо определения этой строки в одинарных кавычках:

'This isn't what I wanted.'

Определите его с помощью двойных кавычек:

"This isn't what I wanted."

И вместо использования двойных кавычек для определения этой строки:

"Sammy says, "Hello!""

Используйте одинарные кавычки:

'Sammy says, "Hello!"'

Использование альтернативного синтаксиса может избавить вас от некоторых проблем, но это не всегда сработает. Например, ни один подход не будет работать для этой строки:

"Sammy says, "I'm a happy shark!""

В этом примере закрывающая двойная кавычка перед + I’m + действительно отбрасывает вещи. Это завершает первую строку, а затем Ruby встречает апостроф в + I’m +, который начинает новую строку со значения + m счастливая акула!" "+. Но эта новая строка не имеет одинарных кавычек, чтобы завершить ее. И использование одинарных кавычек для заключения строки приводит к аналогичной проблеме:

'Sammy says, "I'm a happy shark!"'

На этот раз апостроф в + I’m + завершает строку.

Использование альтернативного синтаксиса также может сделать ваш код несовместимым. Постоянное переключение между строковым синтаксисом может привести к путанице, мы можем escape characters, чтобы обойти эту проблему.

Вариант 2: экранирование символов в строках

Символ обратной косой черты (+ \ +), часто называемый символом escape в строках, не позволяет Ruby интерпретировать следующий символ в строке буквально.

Вот наша проблемная строка, закодированная в двойных кавычках, с двойными кавычками внутри:

"Sammy says, "I'm a happy shark!""

Создайте новую Ruby-программу с именем + quoting.rb + и добавьте этот код в файл:

quoting.rb

print "Sammy says, "I'm a happy shark!""

Запустите программу:

ruby quoting.rb

И вы увидите этот вывод:

Outputquoting.rb:1: syntax error, unexpected tCONSTANT, expecting end-of-input
print "Sammy says, "I'm a happy shark!""
                    ^

Чтобы исправить ошибку, используйте обратную косую черту перед внутренними двойными кавычками:

quoting.rb

print "Sammy says, \"I'm a happy shark!\""

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

Sammy says, "I'm a happy shark!"

Обратите внимание, что вам не нужно избегать апострофа в этом примере, поскольку здесь нет конфликта. Вам нужно только избежать кавычек, которые запутают Ruby.

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

Вариант 3. Использование альтернативного синтаксиса для строк

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

%$Sammy says, "I'm a happy shark!"$

Этот синтаксис автоматически исключит встроенные строки для вас. Фактическая строка выглядит так:

"Sammy says, \"I'm a happy shark!\""

Тем не менее, изменение разделителя означает, что вы должны покинуть разделитель, если вам нужно его использовать. В этом случае. Если бы вам пришлось использовать знак доллара в вашей строке, вам нужно было бы избежать буквального знака доллара в строке.

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

%{Sammy says, "I'm a happy shark!"}

Все эти формы поддерживают интерполяцию строк, если вам это нужно.

droplets = 5
print %{Sammy says, "I just created #{droplets} droplets!"}

Вы также увидите, что +% Q {} + и +% q {} + используются для определения строк в программах на Ruby. Синтаксис +% Q {} + работает точно так же, как строки в двойных кавычках, что означает, что вам не нужно вводить двойные кавычки, и вы сможете использовать интерполяцию строк:

droplets = 5
print %Q{Sammy says, "I just created #{droplets} droplets!"}

Синтаксис +% q {} + работает точно так же, как строки в одинарных кавычках:

%q{Sammy says, "I'm a happy shark!"}

Вы можете увидеть синтаксис +% q + и +% Q +, используемый в некоторых программах с круглыми или квадратными скобками вместо фигурных скобок.

Как видите, в Ruby существует множество способов создания строк. Какой бы метод вы ни выбрали, будьте последовательны в своем коде. Вы обнаружите, что методы +% Q {} + и +% {} + являются наиболее распространенными.

Теперь, когда вы знаете, как обрабатывать специальные символы, давайте рассмотрим, как обрабатывать длинные строки и символы новой строки.

Длинные строки и переводы строки

Иногда вам может понадобиться вставить символ новой строки или возврат каретки в вашей строке. Вы можете использовать экранирующие символы + \ n + или + \ r +, чтобы вставить новую строку в код:

output = "This is\na string\nwith newlines"
puts output

Эта программа выдаст такой вывод:

OutputThis is
a string
with newlines

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

Во-первых, вы можете использовать оператор конкатенации, чтобы разбить строку на несколько строк:

output = "This is a\n" +
        "longer string\n" +
        "with newlines."
puts output

Это просто объединяет три строки вместе, подобно тому, что вы уже сделали.

Вы также можете просто поместить разрывы строк прямо в строку:

output = "This is a
        longer string
        with newlines"
puts output

Вы также можете использовать любой из альтернативных синтаксисов строк для создания многострочных строк:

output = %{This is a
          longer string
          with newlines}
puts output

В обоих этих примерах обратите внимание, что нам не нужны символы новой строки (+ \ n +). Этот подход сохраняет пробелы, включая отступы и новые строки.

В результате выходные данные будут содержать разрывы строк, а также все начальные отступы, например:

OutputThis is a
          longer string
          with newlines

Чтобы предотвратить это, удалите лишние пробелы из своего кода:

output = %{This is a
longer string
with newlines
}

Вы также можете создавать многострочные строки, используя _https: //en.wikipedia.org/wiki/Here_document [heredoc] _ или «здесь документ», термин, используемый для многострочных строковых литералов в программах. Вот как вы написали бы этот код:

output = <<-END
This is a
longer string
with newlines
END

Маркеры + << - END и` + END` обозначают начало и конец heredoc.

Heredocs в Ruby также сохраняет пробельные символы, что означает, что если вы сделаете отступ в коде в heredoc, также сохранятся начальные отступы. Итак, этот код:

output = <<-END
 This is a
 longer string
 with newlines
END

распечатал бы с двумя пробелами отступа.

В Ruby 2.3 и более поздних версиях используется синтаксис «волнистого наследства», который автоматически удаляет этот начальный пробел. Замените дефис в определении heredoc тильдой, чтобы + << - + стало + << ~ +, например так:

output = <<~END
 This is a
 longer string
 with newlines
 and the code is indented
 but the output is not.
END

Это дает следующий вывод:

OutputThis is a
longer string
with newlines
and the code is indented
but the output is not.

Это позволяет вам использовать heredocs и держать ваш код хорошо с отступом.

Heredocs в Ruby также поддерживает интерполяцию строк.

Как вы можете видеть, в Ruby есть много способов обрабатывать строки и многострочные строки. Вы столкнетесь со всеми этими методами при работе с существующим кодом Ruby, поскольку каждый проект имеет свой собственный стиль. В своем собственном коде выберите стиль, который подходит именно вам, и будьте последовательны.

Репликация строк

Могут быть случаи, когда вам нужно использовать Ruby для повторения строки символов несколько раз. Вы можете сделать это с помощью оператора + * +. Как и оператор +, оператор + * + имеет другое применение при использовании с числами, где он является оператором для умножения. При использовании с одной строкой и одним целым числом + * + является оператором репликации _строки, повторяя одну строку, сколько раз вы хотели бы использовать предоставленное вами целое число.

Чтобы напечатать + Sammy + девять раз, вы должны использовать следующий код:

print "Sammy" * 9

Этот код производит следующий вывод:

OutputSammySammySammySammySammySammySammySammySammy

Вы можете использовать это, чтобы создать красивое искусство ASCII. Создайте файл с именем + banner.rb + и добавьте следующий код:

puts "=" * 15
puts "| Hello World |"
puts "=" * 15

Можете ли вы представить, что программа выдаст перед запуском?

Он производит этот вывод:

Output===============
| Hello World |
===============

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

Заключение

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