Метод count подсчитывает число вхождений в строку символов из заданного набора:
s1 = "abracadabra"
a = s1.count("с") # 1
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 # Печатается: Внимание\007\007\007
s2 = "abc\t\tdef\tghi\n\n"
puts s2.dump # Печатается: abc\t\tdef\tghi\n\n
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