Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Рядки.doc
Скачиваний:
0
Добавлен:
12.09.2019
Размер:
79.87 Кб
Скачать

Рядки

Рядки - це довільної довжини набори символів, які укладені в одинарні або подвійні лапки. Приклад рядків:

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!"