Ruby/Подробнее о строках: различия между версиями
Содержимое удалено Содержимое добавлено
Butko (обсуждение | вклад) м ищите → ищете |
|||
Строка 1:
== Подробнее о строках ==
Строка
Строковый тип является самым популярным в любом языке программирования. Ведь без него невозможно написать любую программу (особенно учитывая, что любая программа
{{info|Студенты четвёртого курса МЭТТ ГАИ поступили на подготовительные курсы в [[w:Московский государственный индустриальный университет|МГИУ]]. Там им начали преподавать основы программирования на Ruby. И одна из заданных им задач была: «Дано число, необходимо поменять порядок цифр на обратный». Задача сложная, но наши студенты об этом не знали и решили её преобразованием к строке: <code>given.to_s.reverse</code>. Преподаватели были поражены и впредь запретили им использовать преобразования к строке в своих программах. И всё потому, что это сильно упрощало решение и давало студентам огромное преимущество перед остальными слушателями курсов.}}
Строка 12:
Следует упомянуть два очень интересных момента:
* Cтроки
* Cтроки очень удобно преобразовывать в массив и обратно (методы <code>.join</code> и <code>.split</code>). Поэтому работа со строками практически столь же удобная, как и с массивами.
Строка 22:
<!--{{Начало цитаты}}
Зажатые в лапках работать хотят,<br />
а строки в минутах лениво сопят.
{{Конец цитаты}}
-->
Давайте будем называть строки в апострофах «ленивыми», а строки в кавычках
Вставка
Вставка жизнью заправляет:<br />
Код программный выполняет,<br />
Тихо результат считает,<br />
Вместо вставки подставляет.
Строка 39:
Специальный символ начинается со знака <code>\</code> ([[w:Обратная косая черта|обратная косая черта]]). Самые популярные из них: <code>\n</code> (переход на новую строку), <code>\t</code> ([[w:Табуляция|табуляция]]), <code>\\</code> (обратная косая черта) и <code>\"</code> ([[w:Кавычки|двойная кавычка]]).
Хотя специальный символ и пишется, как два знака, но на деле это всего один символ. Доказать это можно выполненением
==== Для чего нужны работящие и ленивые строки? ====
Строка 140:
end</source>
Этот код как раз и говорит о том, что деление и <code>.split</code>
Деление стало нужно, когда метод <code>*</code> для массивов получил возможность работать, как <code>.join</code> (преобразовать массив в строку, расположив элементы через разделитель). В виду того, что <code>.join</code> и <code>.split</code> работают вместе точно также, как умножение и деление, то появилась идея заставить работать деление как <code>.split</code>.
Строка 160:
["Ку", "ку"].to_s #=> "Куку"</source>
Кукушка кукует,<br />
строку генерит.<br />
Из строчки массив<br />
Получу через <code>.split</code>.
Строка 220:
==== Строка-перевёртыш ====
Иногда хочется перевернуть строку задом наперед. Причины могут быть разные. Например, вы
Узнаем настоящее имя Алукарда из аниме Hellsing:
Строка 227:
Не стоит путать метод <code>.reverse</code> для массивов с методом <code>.reverse</code> для строк. В массивах меняется порядок элементов, а в строках
==== Меняю шило на мыло! ====
Для того, чтобы заменить <code>"шило"</code> на <code>"мыло"</code> используется не газета
<source lang="ruby">"шило в мешке не утаишь".sub("шило", "мыло")
#=> "мыло в мешке не утаишь"</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> произошло от английского
==== Сканируем текст на ошибки. ====
Строка 266:
{{Начало цитаты}}
Нашел ошибку метод <code>.scan</code>,<br />
В массив её запомнил.<br />
Учителям он свыше дан!<br />
Зачем его я вспомнил?!
{{Конец цитаты}}
Строка 274:
==== Правила работы со строками. ====
Правила
Правила в Ruby ограничиваются символами <code>/</code> (косая черта). Примеры правил:
Строка 296:
===== Символьный класс. =====
Символьный класс
<source lang="ruby">
Строка 305:
* Можно использовать <code>-</code> (дефис) для указания диапазонов символов.
* Если первый символ класса (идущий сразу после открывающейся квардратной скобки)
* Некоторые популярные классы имеют короткую запись.
Строка 311:
|+Короткие записи популярных символьных классов
|-
!Короткая<br />запись || Полная<br />запись || Описание
|-
|<code>\s</code>||<code>[\f\t\n\r]</code>
|-
|<code>\S</code>||<code>[^\f\t\n\r]</code>
|-
|<code>\d</code>||<code>[0-9]</code>
|-
|<code>\D</code>||<code>[^0-9]</code>
|-
|<code>\w</code>||<code>[a-zA-Z0-9]</code>
|-
|<code>\W</code>||<code>[^a-zA-Z0-9]</code> || Любой символ, кроме латиницы или цифры
|-
|<code>.</code> ||<code>[^\n\r]</code>
|-
|<code>\b</code>||<code></code> || Граница слова
Строка 365:
|}
Снова посмотрите на примеры правил. Теперь вам они понятны? Если нет, то перечитайте две предыдущие главы
===== Альтернатива =====
Строка 386:
Почти калькулятор!
Существует много видов группировок. Например, <code>(?:…)</code>
===== Фиксирующая директива =====
Фиксирующие директивы
<source lang="ruby">/^\d+/ #=> строка начинается с числа
Строка 398:
Насколько видно из примеров,
* <code>^</code>
* <code>$</code>
Фиксирующих директив гораздо больше двух. Об остальных читайте в специализированной литературе.
Строка 412:
Бывают следующие модификаторы:
*
*
* e
Игнорирование регистра работает только для латиницы.
Строка 449:
Оно состоит из двух частей:
* альтернативы с группировкой
* символа
В альтернативе мы указали буквы с которых начинается неправильный слог. Символ просто добавляется
Зачем была использована группировка? Для пояснения причины, рассмотрим код в фигурных скобках:
Строка 460:
Вот для того, чтобы можно было использовать переменную <code>$1</code> (результат первой группировки) мы и задействовали группировку. В данном случае, в <code>$1</code> сохраняется первая буква слога, которая в результате исправления оШЫбки не меняется.
* Для того, чтобы получить доступ к результату первой группировки, надо обратиться к переменной <code>$1</code> (один доллар), ко второй
* Переменные <code>$1</code>
Можно ли было решить эту же задачу иначе? Конечно можно!
Строка 472:
Есть ещё пару интересных моментов, которые вам необходимо знать. Во время предыдущего примера вас могли посетить следующие вопрос: а как получить весь текст, который совпал с правилом? Неужели необходимо делать всеобщую группировку?
Ответ на этот вопрос одназначный
<source lang="ruby">"Раз, два, три!".gsub(/[а-я]+/){ |word| word.reverse }
Строка 496:
Выполните её, посмотрите результат, а потом замените любую из группировок <code>(?:…)</code> на <code>(…)</code> и снова взгляните на результат.
Ну со <code>.scan</code> должно быть всё понятно. А вот то, что метод <code>[]</code> начинает тоже правильно искать
<source lang="ruby">"Раз, два, три!"[/[А-Яа-я]+/] #=> "Раз"</source>
Строка 554:
Очевидно, что оно состоит из четырёх частей:
* <code>(.{1, 80})</code>
* <code>( +|$\n?)</code>
* <code>|</code>
* <code>(.{1, 80})</code>
В результате работы этого правила произойдёт сопоставление с группировками 1 и 2 или 3. В первом случае будет обрабатываться строка, слова в которой по длине не превышают 80. Во втором случае строка будет принудительно усечена до 80 символов. Другими словами, мы пытаемся сделать перенос по словам, но если у нас не получается, то мы будем делать перенос так, как у нас получится.
Строка 579:
p "Это #{cont}" #=> "Это контейнер"</source>
Если нужно, чтобы ваши обьекты упорядочивались и сравнивались с обычными строками, следует применять примесь <code>Comparable</code> и единственный специальный метод <code>to_str</code>. Наличие этого метода у вашего объекта
<source lang="ruby">class Container
|