третий кусок
текста.
str3
По умолчанию встроенный документ ведет себя как строка в двойных кавычках, то есть внутри него интерпретируются управляющие последовательности и интерполируются выражения. Но если концевой маркер заключен в одиночные кавычки, то и весь документ ведет себя как строка в одиночных кавычках:
str = <<'EOF'
Это не знак табуляции:
а это не символ новой строки:
EOF
Если концевому маркеру встроенного документа предшествует дефис, то маркер может начинаться с красной строки. При этом удаляются только пробелы из той строки, на которой расположен сам маркер, но не из предшествующих ей строк документа.
str = <<-EOF
Каждая из этих строк
начинается с пары
пробелов.
EOF
Опишу стиль, который нравится лично мне. Предположим, что определен такой метод margin
:
class String
def margin
arr = self.split('
') # Разбить на строки.
arr.map! {|x| x.sub!(/s*|/,'')) # Удалить начальные символы.
str = arr.join('
') # Объединить в одну строку.
self.replace(str) # Подменить исходную строку.
end
end
Для ясности я включил подробные комментарии. В этом коде применяются конструкции, которые будут рассмотрены ниже —
как в этой, так и в последующих главах. Используется этот метод так:
str = <<end.margin
|Этот встроенный документ имеет 'левое поле'
|на уровне вертикальной черты в каждой строке.
|
| Можно включать цитаты,
| делать выступы и т.д.
end
В качестве концевого маркера естественно употребить слово end
. (Впрочем, это дело вкуса. Выглядит такой маркер как зарезервированное слово end
, но на самом деле этот выбор ничуть не хуже любого другого.) Каждая строка начинается с символа вертикальной черты, но эти символы потом отбрасываются вместе с начальными пробелами.
2.4. Получение длины строки
Для получения длины строки служит метод length
. У него есть синоним size
.
str1 = 'Карл'
x = str1.length # 4
str2 = 'Дойль'
x = str2.size # 5
2.5. Построчная обработка
Строка в Ruby может содержать символы новой строки. Например, можно прочитать в память файл и сохранить его в виде одной строки. Применяемый по умолчанию итератор each в этом случае перебирает отдельные строки:
str = 'Когда-то
давным-давно...
Конец
'
num = 0
str.each do |line|
num += 1
print 'Строка #{num}: #{line}'
end
Выполнение этого кода дает следующий результат:
Строка 1: Когда-то
Строка 2: давным-давно...
Строка 3: Конец
Альтернативно можно было бы воспользоваться методом each_with_index
.
2.6. Побайтовая обработка
Поскольку на момент написания этой книги язык Ruby еще не поддерживал интернационализацию в полной мере, то символ и байт —
по существу одно и то же. Для последовательной обработки символов пользуйтесь итератором each_byte
:
str = 'ABC'
str.each_byte {|char| print char, ' ' }
#Результат: 65 66 67.
В текущей версии Ruby строку можно преобразовать в массив односимвольных строк с помощью метода scan
, которому передается простое регулярное выражение, соответствующее одному символу:
str = 'ABC'
chars = str.scan(/./)
chars.each {|char| print char, ' ' }
#Результат: ABC.
2.7. Специализированное сравнение строк
В язык Ruby уже встроен механизм сравнения строк: строки сравниваются в привычном лексикографическом порядке (то есть на основе упорядочения, присущего данному набору символов). Но при желании можно задать собственные правила сравнения любой сложности.