- •Інтерполяція рядків
- •Конкантенація рядків
- •Робота з рядками
- •Видалення пробілів
- •Дано рядок. Необхідно знайти загальну кількість російських символів.
- •Дано рядок, який складається з символів латиниці. Необхідно перевірити впорядкування рядка по зростанню.
- •Дана рядок в якому слова записані через пробіл. Необхідно перемішати всі слова цього рядка у випадковому порядку.
Рядки
Рядки - це довільної довжини набори символів, які укладені в одинарні або подвійні лапки. Приклад рядків:
‘this is a string’
‘This is a string in single quotes’
Ви також можете ставити рядковий літерал в будь-яку іншу пару символів, крім одинарних і подвійних лапок вказуючи ставлячи перед ним спеціальний ідентифікатор рядка %q, наприклад:
%q!this is a string in single quotes!
%q{this is a string in single quotes}
Ви не можете використовувати лише цифри і букви, всі інші символи доступні для укладання в них строкового літерала. Представлене в прикладі вище вкладення рядка в довільні символи рівнозначне розміщенню між одинарними лапками. Це важливо знати тому, що між рядком в одинарних лапках і в подвійних є велика різниця, але про це трішки нижче.
Ruby також дозволяє створювати рядкові літерали, які займають кілька фізичних рядків:
str="Welcome to\n Ruby!"
В результаті такого оголошення мінлива str буде зберігати наступний рядок: “Welcome to \n Ruby!”, Де \n є спеціальним символом нового рядка.
Існує також наступний стиль (більш акуратний і бажаний) для створення багаторядкових строкових літералів:
str = << STR
This is a
Multiline
String
STR
Тут, замість STR - ідентифікатора кінця рядка може бути використаний будь-який інший слово, наприклад error_message, wellcome_message і так далі.
Інтерполяція рядків
Нарешті ми дійшли до того моменту, коли ви дізнаєтеся різницю між рядками вкладеними в одинарні та подвійні лапки. Рядки вкладені в подвійні лапки можуть містити виконувані фрагменти коду, а також спеціальні символи, наприклад той же символ нового рядка. Поміщений в рядок код буде виконаний і на його місце в рядку буде вставлено повернене ним значення. Код, який ви бажаєте помістити в рядок слід вкласти в фігурні дужки перед якими повинен слідувати символ шарп - #{тут ваш код}, приклади:
a="String a has #{a.class} type" # => "String a has String type"
a=1
b=2
c="a+b= #{a+b}" #=> "a+b=3"
Якщо ви не бажаєте, щоб щось поміщене в #{} виконувалося як код і щоб спеціальні символи які містяться в рядку ігнорувалися, то слід використовувати одинарні лапки для укладання в них рядки, або екранувати ті фрагменти рядки, укладеної в подвійні лапки, які можуть виконуватися. Екранування відбувається за допомогою символу зворотного слеша «\», приклади:
c='a+b= #{a+b}' #=> "a+b=\ #{a+b}"
c="a+b= \ #{a+b}" #=> "a+b =\ #{a+b}"
Зверніть увагу, що не залежно від того, в подвійні або одинарні лапки ми укладаємо рядок, змінній присвоюється рядок вкладений в подвійні лапки. Це означає, що в рядку вкладене в одинарні лапки автоматично екранується.
Не дивлячись на те, що в рядках вкладених в одиничні лапки екранування відбувається автоматично, все-таки існує один символ, який вам однозначно доведеться екранувати - це власне одинарні лапки, приклад:
str = 'hello' Ruby'!' # Відбудеться помилка!
str = 'hello \' Ruby \ '!' # => "Hello 'Ruby'!"
Таке екранування в одинарних рядках необхідно для того, щоб інтерпретатор при читанні коду не плутався в тому, чи є одиничні лапка частиною рядка, чи вони завершують її. Саме для таких випадків і була додана можливість створення рядків за допомогою ідентифікатора рядки %q і довільних оточуючих символів, так як рядок створена в такий спосіб абсолютно ідентичний рядку вкладеному в одинарні лапки з тією лише різницею, що вам не потрібно екранувати наявні в рядку лапки, приклад:
str = %q <Hello'Chuck'!> # => "Hello 'Chuck'!"
У способи створення багаторядкового рядка за допомогою <<END_IDENTIFIER має також деякий нюанс, наприклад такий метод створення рядків може бути аналогічний до створення рядків у подвійних лапках, так і в одинарних, приклад:
str = << END
#{"Hello Chuck!"}
END
# => "Hello Chuck! \n"
str = << "END"
#{"Hello Chuck!"}
END
#=> "Hello Chuck! \n"
str = << 'END'
# зверніть увагу на лапки в які укладено END
# {"Hello Chuck!"}
END
# => "\ #{\" Hello Chuck! \"} \n"
На цьому з створенням рядків ми покінчили, перейдемо до такого важливого заняття, як робота з рядками!
Конкантенація рядків
Ruby дуже витончена мову програмування, яка має дуже зручний і зрозумілий синтаксис і надає дуже багато вбудованих методів для роботи з основними типами.
Об'єднання рядків (конкантенація рядків). Для об'єднання рядків досить використовувати оператор + (як не дивно він же мето), приклад:
str = "first string" + "" + "second string" # => "first string second string"
Ще один спосіб об'єднати рядки - це оператор *, який займається тим, що об'єднує рядок зі своїми копіями N-число раз, приклад:
"String" * 3 # => "string string string"
В Ruby рядки мають кілька подібностей з масивами з тієї причини, що кожен символ рядка має свій індекс - порядок в рядку за яким до нього можна звернутися. Якщо говорити ще точніше, то таких індексів цілих два: лівобічний і правобічний, приклади:
str = "abcdefg"
str [0] # => "a"
str [1] # => "b"
str [2] # => "c"
str [-1] # => "g"
str [-2] # => "f"
str [-3] # => "e"
Лівобічні індекси вказують позицію символу з лівого боку (з початку) рядки і починаються з нуля. Правобічні індекси вказують позицію символу з правого боку (з кінця рядка) і починаються з -1, при цьому всі правобічні індекси мають у собі знак “-”, який і відрізняє їх від лівосторонніх. Термінологія “ліва сторона рядка” і “права сторона рядка” більш коректна, оскільки, наприклад, в арабській мові лист йде справа на ліво.
Ruby дозволяє вам звертатися не тільки до окремого символу в рядку, а й до набору таких символів, для цього в квадратних дужках необхідно вказувати, або індекс першого обраного символу і кількість вибираних символів, або діапазон індексів обираних символів, приклади:
str [0, str.size] # => "abcdefg"
str [0,3] # => "abc"
str [-1,5] # => "g"
str [0 .. str.size-1] # => "abcdefg"
str [0 .. 2] # => "abc"
str [0 .. -1] # => "abcdefg"
str [0 .. -3] # => "abcde"
str [0 ... -3] # => "abcd"
Ви не тільки можете отримувати фрагменти рядки, але і встановлювати для них значення:
str # => "abcdefg"
str [0] = "z"
str # => "zbcdefg"
str [1 .. str.size] = "hello"
str # => "zhello"
str [0 .. str.size] = ""
str # => ""
str [0 .. 1000] = "Hello Tom!"
str # => "Hello Tom!"