Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

2.3. Встроенные документы

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

str = "Три девицы под окном

Пряли поздно вечерком..."

Но тогда отступ окажется частью строки.

Можно вместо этого воспользоваться встроенным документом, изначально предназначенным для многострочных фрагментов. (Идея и сам термин заимствованы из более старых языков.) Синтаксически он начинается с двух знаков

<<
,
за которыми следует концевой маркер, нуль или более строк текста и в завершение тот же самый концевой маркер в отдельной строке:

str = <<EOF

Три девицы под окном

Пряли поздно вечерком...

EOF

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

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

some_method(<<str1, <<str2, <<str3)

первый кусок

текста...

str1

второй кусок...

str2

третий кусок

текста.

str3

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

str = <<'EOF'

Это не знак табуляции: \t

а это не символ новой строки: \n

EOF

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

str = <<-EOF

Каждая из этих строк

начинается с пары

пробелов.

EOF

Опишу стиль, который нравится лично мне. Предположим, что определен такой метод

margin
:

class String

 def margin

arr = self.split("\n") # Разбить на строки.

arr.map! {|x| x.sub!(/\s*\|/,"")) # Удалить начальные символы.

str = arr.join("\n") # Объединить в одну строку.

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 = "Когда-то\nдавным-давно...\nКонец\n"

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
, которому передается простое регулярное выражение, соответствующее одному символу:

Поделиться:
Популярные книги

Тринадцатый IX

NikL
9. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Тринадцатый IX

На границе империй. Том 10. Часть 3

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 3

Седина в бороду, Босс… вразнос!

Трофимова Любовь
Юмор:
юмористическая проза
5.00
рейтинг книги
Седина в бороду, Босс… вразнос!

Черный Маг Императора 15

Герда Александр
15. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
сказочная фантастика
фэнтези
фантастика: прочее
5.00
рейтинг книги
Черный Маг Императора 15

Идеальный мир для Лекаря 22

Сапфир Олег
22. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 22

Шутка

Кундера Милан
Проза:
современная проза
6.60
рейтинг книги
Шутка

Дважды одаренный. Том IV

Тарс Элиан
4. Дважды одаренный
Фантастика:
городское фэнтези
альтернативная история
аниме
7.00
рейтинг книги
Дважды одаренный. Том IV

Черный Маг Императора 7 (CИ)

Герда Александр
7. Черный маг императора
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 7 (CИ)

Барон отрицает правила

Ренгач Евгений
13. Закон сильного
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Барон отрицает правила

Выйду замуж за спасателя

Рам Янка
1. Спасатели
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Выйду замуж за спасателя

Бастард Бога (Дилогия)

Матвеев Владимир
Фантастика:
альтернативная история
5.11
рейтинг книги
Бастард Бога (Дилогия)

Кодекс Охотника. Книга XXIV

Винокуров Юрий
24. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXIV

Искатель 2

Шиленко Сергей
2. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 2

Сила рода. Том 1 и Том 2

Вяч Павел
1. Претендент
Фантастика:
фэнтези
рпг
попаданцы
5.85
рейтинг книги
Сила рода. Том 1 и Том 2