Ruby/Подробнее о строках: различия между версиями
Содержимое удалено Содержимое добавлено
Строка 1:
== Подробнее о строках ==
Строка
Строковый тип является самым популярным в любом языке программирования. Ведь без него невозможно написать любую программу (особенно учитывая, что любая программа
{{info|Студенты четвёртого курса МЭТТ ГАИ поступили на подготовительные курсы в [[w:Московский государственный индустриальный университет|МГИУ]]. Там им начали преподавать основы программирования на Ruby. И одна из заданных им задач была: «Дано число, необходимо поменять порядок цифр на обратный». Задача сложная, но наши студенты об этом не знали и решили её преобразованием к строке: <code>given.to_s.reverse</code>. Преподаватели были поражены и впредь запретили им использовать преобразования к строке в своих программах. И всё потому, что это сильно упрощало решение и давало студентам огромное преимущество перед остальными слушателями курсов.}}
Строка 12:
Следует упомянуть два очень интересных момента:
* Cтроки
* Cтроки очень удобно преобразовывать в массив и обратно (методы <code>.join</code> и <code>.split</code>). Поэтому работа со строками практически столь же удобная, как и с массивами.
Строка 26:
{{Конец цитаты}}
-->
Давайте будем называть строки в апострофах «ленивыми», а строки в кавычках
Вставка
Вставка жизнью заправляет:<br />
Строка 140:
end</source>
Этот код как раз и говорит о том, что деление и <code>.split</code>
Деление стало нужно, когда метод <code>*</code> для массивов получил возможность работать, как <code>.join</code> (преобразовать массив в строку, расположив элементы через разделитель). В виду того, что <code>.join</code> и <code>.split</code> работают вместе точно также, как умножение и деление, то появилась идея заставить работать деление как <code>.split</code>.
Строка 227:
Не стоит путать метод <code>.reverse</code> для массивов с методом <code>.reverse</code> для строк. В массивах меняется порядок элементов, а в строках
==== Меняю шило на мыло! ====
Строка 236:
#=> "мыло в мешке не утаишь"</source>
Естественно, что менять можно не только шило и мыло, но и другие данные. Например, возраст. Девушка Ирина утверждает, что ей 18, но мы-то знем, что ей 26. Давайте восстановим истину, возможно
<source lang="ruby">"Ирине 18 лет.".sub("18", "26") #=> "Ирине 26 лет."</source>
Заметили, что мы используем только метод <code>.sub</code>? Давайте теперь рассмотрим работу метода <code>.gsub</code> и его отличие от <code>.sub</code>. На этот раз мы будем исправлять текст, авторы которого
<source lang="ruby">string = "жыло-было шыбко шыпящее жывотное"
Строка 247:
string.gsub("жы", "жи").gsub("шы", "ши") #=> "жило-было шибко шипящее животное"</source>
Метод <code>.sub</code> производит только одну замену, а <code>.gsub</code>
Название метода <code>.sub</code> произошло от английского «substitute»
==== Сканируем текст на ошибки. ====
Строка 274:
==== Правила работы со строками. ====
Правила
Правила в Ruby ограничиваются символами <code>/</code> (косая черта). Примеры правил:
Строка 296:
===== Символьный класс. =====
Символьный класс
<source lang="ruby">
Строка 305:
* Можно использовать <code>-</code> (дефис) для указания диапазонов символов.
* Если первый символ класса (идущий сразу после открывающейся квардратной скобки)
* Некоторые популярные классы имеют короткую запись.
Строка 365:
|}
Снова посмотрите на примеры правил. Теперь вам они понятны? Если нет, то перечитайте две предыдущие главы
===== Альтернатива =====
Строка 386:
Почти калькулятор!
Существует много видов группировок. Например, <code>(?:…)</code>
===== Фиксирующая директива =====
Фиксирующие директивы
<source lang="ruby">/^\d+/ #=> строка начинается с числа
Строка 398:
Насколько видно из примеров,
* <code>^</code>
* <code>$</code>
Фиксирующих директив гораздо больше двух. Об остальных читайте в специализированной литературе.
Строка 412:
Бывают следующие модификаторы:
* '''m'''ultiline
* '''i'''gnorcase
* e'''x'''tended
Игнорирование регистра работает только для латиницы.
Строка 497:
Выполните её, посмотрите результат, а потом замените любую из группировок <code>(?:…)</code> на <code>(…)</code> и снова взгляните на результат.
Ну со <code>.scan</code> должно быть всё понятно. А вот то, что метод <code>[]</code> начинает тоже правильно искать
<source lang="ruby">"Раз, два, три!"[/[А-Яа-я]+/] #=> "Раз"</source>
Строка 559:
Очевидно, что оно состоит из четырёх частей:
* <code>(.{1, 80})</code>
* <code>( +|$\n?)</code>
* <code>|</code>
* <code>(.{1, 80})</code>
В результате работы этого правила произойдёт сопоставление с группировками 1 и 2 или 3. В первом случае будет обрабатываться строка, слова в которой по длине не превышают 80. Во втором случае строка будет принудительно усечена до 80 символов. Другими словами, мы пытаемся сделать перенос по словам, но если у нас не получается, то мы будем делать перенос так, как у нас получится.
Строка 584:
p "Это #{cont}" #=> "Это контейнер"</source>
Если нужно, чтобы ваши обьекты упорядочивались и сравнивались с обычными строками, следует применять примесь <code>Comparable</code> и единственный специальный метод <code>to_str</code>. Наличие этого метода у вашего объекта
<source lang="ruby">class Container
|