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

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

Жанры

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

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

Метод

gsub
(глобальная подстановка) отличается от
sub
лишь тем, что заменяются все вхождения, а не только первое:

s5 = "alfalfa abracadabra"

s6 = s5.gsub(/a[bl]/,"xx")# "xxfxxfa xxracadxxra"

s5.gsub!(/[lfdbr]/) { |m| m.upcase + "-" }

# s5 теперь равно "aL-F-aL-F-a aB-R-acaD-aB-R-a"

Метод

Regexp.last_match
эквивалентен действию специальной переменной
$&
(она же
$MATCH
).

2.14. Поиск в строке

Помимо различных способов доступа к подстрокам, есть и другие методы поиска в строке. Метод

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

str = "Albert Einstein"

pos1 = str.index(?E) # 7

pos2 = str.index("bert") # 2

pos3 = str.index(/in/) # 8

pos4 = str.index(?W) # nil

pos5 = str.index("bart") # nil

pos6 = str.index(/Wein/) # nil

Метод

rindex
начинает поиск с конца строки. Но номера позиций отсчитываются тем не менее от начала:

str = "Albert Einstein"

pos1 = str.rindex(?E) # 7

pos2 = str.rindex("bert") # 2

pos3 = str.rindex(/in/) # 13 (найдено самое правое соответствие)

pos4 = str.rindex(?W) # nil

pos5 = str.rindex("bart") # nil

pos6 = str.rindex(/wein/) # nil

Метод

include?
сообщает, встречается ли в данной строке указанная подстрока или один символ:

str1 = "mathematics"

flag1 = str1.include? ?e # true

flag2 = str1.include? "math" # true

str2 = "Daylight Saving Time"

flag3 = str2.include? ?s # false

flag4 = str2.include? "Savings" # false

Метод

scan
многократно просматривает строку в поисках указанного образца. Будучи вызван внутри блока, он возвращает массив. Если образец содержит несколько (заключенных в скобки) групп, то массив окажется вложенным:

str1 = "abracadabra"

sub1 = str1.scan(/а./)

# sub1 теперь равно ["ab","ас","ad","ab"]

str2 = "Acapulco, Mexico"

sub2 = str2.scan(/(.)(c.)/)

# sub2 теперь равно [ ["A","ca"], ["l","со"], ["i","со"] ]

Если при вызове задан блок, то метод поочередно передает этому блоку найденные значения:

str3 = "Kobayashi"

str3.scan(/["aeiou]+[aeiou]/) do |x|

print "Слог: #{x}\n" end

Этот код выводит такой результат:

Слог: Ko

Слог: ba

Слог: уа

Слог: shi

2.15. Преобразование символов в коды ASCII и обратно

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

str = "Martin"

print str[0] # 77

Если в конец строки дописывается объект типа

Fixnum
, то он предварительно преобразуется в символ:

str2 = str << 111 # "Martino"

2.16. Явные и неявные преобразования

На первый взгляд, методы

to_s
и
to_str
могут вызвать недоумение. Ведь оба преобразуют объект в строковое представление, так?

Но есть и различия. Во-первых, любой объект в принципе можно как-то преобразовать в строку, поэтому почти все системные классы обладают методом

to_s
. Однако метод
to_str
в системных классах не реализуется никогда.

Как правило, метод

to_str
применяется для объектов, очень похожих на строки, способных «замаскироваться» под строку. В общем, можете считать, что метод
to_s
— это явное преобразование, а метод
to_str
— неявное.

Я уже сказал, что ни в одном системном классе не определен метод

to_str
(по крайней мере, мне о таких классах неизвестно). Но иногда они вызывают
to_str
(если такой метод существует в соответствующем классе).

Первое, что приходит на ум, — подкласс класса

String
; но на самом деле объект любого класса, производного от
String
, уже является строкой, так что определять метод
to_str
излишне.

А вот пример из реальной жизни. Класс

Pathname
определен для удобства работы с путями в файловой системе (например, конкатенации). Но путь естественно отображается на строку (хотя и не наследует классу
String
).

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

Гримуар темного лорда II

Грехов Тимофей
2. Гримуар темного лорда
Фантастика:
фэнтези
попаданцы
аниме
5.25
рейтинг книги
Гримуар темного лорда II

Фауст

фон Гёте Иоганн Вольфганг
50. Библиотека всемирной литературы
Поэзия:
драматургия
8.33
рейтинг книги
Фауст

Я царь. Книга XXVIII

Дрейк Сириус
28. Дорогой барон!
Фантастика:
боевая фантастика
аниме
попаданцы
5.60
рейтинг книги
Я царь. Книга XXVIII

Римские рассказы

Моравиа Альберто
Проза:
современная проза
5.75
рейтинг книги
Римские рассказы

AutoCAD 2009

Орлов Андрей Александрович
Видеосамоучитель
Компьютеры и Интернет:
программное обеспечение
5.00
рейтинг книги
AutoCAD 2009

Геном

Лукьяненко Сергей Васильевич
1. Геном
Фантастика:
научная фантастика
8.92
рейтинг книги
Геном

Ермак

Федоров Евгений Александрович
Проза:
историческая проза
6.25
рейтинг книги
Ермак

Тень Нерона

Алферова Марианна Владимировна
3. Сыщик
Фантастика:
детективная фантастика
6.25
рейтинг книги
Тень Нерона

#Бояръ-Аниме. Газлайтер. Том 7

Володин Григорий Григорьевич
7. История Телепата
Фантастика:
аниме
фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 7

Жизнь, которой не было

Денис Палимов
1. Жизнь, которой не было
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Жизнь, которой не было

Осколки чести

Буджолд Лоис Макмастер
1. Сага о Форкосиганах
Фантастика:
космическая фантастика
9.34
рейтинг книги
Осколки чести

Вернадский

Гумилевский Лев Иванович
325. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Вернадский

"Фантастика 2025-74". Компиляция. Книги 1-28

Бобров Всеволод Михайлович
Фантастика 2025. Компиляция
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Фантастика 2025-74. Компиляция. Книги 1-28

Черная свеча

Высоцкий Владимир Семенович
Проза:
современная проза
7.88
рейтинг книги
Черная свеча