b = s1.count('bdr') # 5
Строковый параметр ведет себя как простое регулярное выражение. Если он начинается с символа ^
, то берется дополнение к списку:
c = s1.count('^а') # 6
d = s1.count ('^bdr') # 6
Дефис обозначает диапазон символов:
e = s1.count('a-d') # 9
f = s1.count('^a-d') # 2
2.29. Обращение строки
Для обращения строки служит метод reverse
(или его вариант для обращения «на месте» reverse!
):
s1 = 'Star Trek'
s2 = s1.reverse # 'kerT ratS'
si.reverse! # si теперь равно 'kerT ratS'
Пусть требуется обратить порядок слов (а не символов). Тогда можно сначала воспользоваться методом String#split
, который вернет массив слов. В классе Array
тоже есть метод reverse
, поэтому можно обратить массив, а затем с помощью метода join
объединить слова в новую строку:
phrase = 'Now here's a sentence'
phrase.split(' ').reverse.join(' ')
# 'sentence a here's Now'
2.30. Удаление дубликатов
Цепочки повторяющихся символов можно сжать до одного методом squeeze
:
s1 = 'bookkeeper'
s2 = s1.squeeze # 'bokeper'
s3 = 'Hello...'
s4 = s3.squeeze # 'Helo.'
Если указан параметр, то будут удаляться только дубликаты заданных в нем символов:
s5 = s3.squeeze('.') # 'Hello.'
Этот параметр подчиняется тем же правилам, что и параметр метода count
(см. раздел 2.28), то есть допускаются дефис и символ ^
. Имеется также метод squeeze!
.
2.31. Удаление заданных символов
Метод delete
удаляет из строки те символы, которые включены в список, переданный в качестве параметра:
s1 = 'To be, or not to be'
s2 = s1.delete('b') # 'To e, or not to e'
s3 = 'Veni, vidi, vici!'
s4 = s3.delete(',!') # 'Veni vidi vici'
Этот параметр подчиняется тем же правилам, что и параметр метода count
(см. раздел 2.28), то есть допускаются символы -
(дефис) и ^
(каре). Имеется также метод delete!
.
2.32. Печать специальных символов
Метод dump
позволяет получить графическое представление символов, которые обычно не печатаются вовсе или вызывают побочные эффекты:
s1 = 'Внимание' << 7 << 7 << 7 # Добавлено три символа ASCII BEL.
puts s1.dump # Печатается: Внимание 07 07 07
s2 = 'abc def ghi
'
puts s2.dump # Печатается: abc def ghi
s3 = 'Двойная кавычка: ''
puts s3.dump # Печатается: Двойная кавычка: '
При стандартном значении переменной $KCODE
метод dump
дает такой же эффект, как вызов метода inspect
для строки. Переменная $KCODE
рассматривается в главе 4.
2.33. Генерирование последовательности строк
Изредка бывает необходимо получить «следующую» строку. Так, следующей для строки 'aaa'
будет строка 'aab'
(затем 'aac'
, 'aad'
и так далее). В Ruby для этой цели есть метод succ
:
droid = 'R2D2'
improved = droid.succ # 'R2D3'
pill = 'Vitamin B'
pill2 = pill.succ # 'Vitamin C'
He рекомендуется применять этот метод, если точно не известно, что начальное значение предсказуемо и разумно. Если начать с какой-нибудь экзотической строки, то рано или поздно вы получите странный результат.
Существует также метод upto
, который в цикле вызывает succ
, пока не будет достигнуто конечное значение:
'Files, A'.upto 'Files, X' do | letter |
puts 'Opening: #{letter}'
end
# Выводится 24 строки.
Еще раз подчеркнем, что эта возможность используется редко, да и то на ваш страх и риск. Кстати, метода, возвращающего «предшествующую» строку, не существует.
2.34. Вычисление 32-разрядного CRC