Теперь все строки будут сравниваться без учета регистра. И при всех операциях сортировки, которые определены в терминах метода
<=>
, регистр тоже не будет учитываться.
2.8. Разбиение строки на лексемы
Метод
split
разбивает строку на части и возвращает массив лексем. Ему передаются два параметра: разделитель и максимальное число полей (целое).
По умолчанию разделителем является пробел, а точнее, значение специальной переменной
$;
или ее англоязычного эквивалента
$FIELD_SEPARATOR
. Если же первым параметром задана некоторая строка, то она и будет использоваться в качестве разделителя лексем.
s1 = "Была темная грозовая ночь."
words = s1.split # ["Была", "темная", "грозовая", "ночь]
s2 = "яблоки, груши, персики"
list = s2.split(", ") # ["яблоки", "груши", "персики"]
s3 = "львы и тигры и медведи"
zoo = s3.split(/ и /) # ["львы", "тигры", "медведи"]
Второй параметр ограничивает число возвращаемых полей, при этом действуют следующие правила:
1. Если параметр опущен, то пустые поля в конце отбрасываются.
2. Если параметр — положительное число, то будет возвращено не более указанного числа полей (если необходимо, весь «хвост» строки помещается в последнее поле). Пустые поля в конце сохраняются.
3. Если параметр — отрицательное число, то количество возвращаемых полей не ограничено, а пустые поля в конце сохраняются.
Спрашивается, зачем нужен этот метод, если можно просто интерполировать значения в строку с помощью конструкции
#{expr}
? А затем, что
sprintf
позволяет выполнить дополнительное форматирование - например, задать максимальную ширину поля или максимальное число цифр после запятой, добавить или подавить начальные нули, выровнять строки текста по левой или правой границе и т.д.
str = sprintf("%-20s %3d", name, age)
В классе
String
есть еще метод
%
, который делает почти то же самое. Он принимает одно значение или массив значений любых типов:
str = "%-20s %3d" % [name, age] # To же, что и выше
Имеются также методы
ljust
,
rjust
и
center
; они принимают длину результирующей строки и дополняют ее до указанной длины пробелами, если это необходимо.
str = "Моби Дик"
s1 = str.ljust(12) # "Моби Дик"
s2 = str.center(12) # " Моби Дик "
s3 = str.rjust(12) # " Моби Дик"
Можно задать и второй параметр, который интерпретируется как строка заполнения (при необходимости она будет урезана):
str = "Капитан Ахав"
s1 = str.ljust(20,"+") # "Капитан Ахав++++++++"
s2 = str.center(20,"-") # "----Капитан Ахав----"
s3 = str.rjust(20,"123") # "12312312Капитан Ахав"
2.10. Строки в качестве объектов ввода/вывода
Помимо методов
sprintf
и
scanf
, есть еще один способ имитировать ввод/вывод в строку: класс
StringIO
.
Из-за сходства с объектом
IO
мы рассмотрим его в главе, посвященной вводу/выводу (см. раздел 10.1.24).
2.11. Управление регистром
В классе
String
есть множество методов управления регистром. В этом разделе мы приведем их краткий обзор.
Метод
downcase
переводит символы всей строки в нижний регистр, а метод
upcase
— в верхний:
s1 = "Бостонское чаепитие"
s2 = s1.downcase # "бостонское чаепитие"
s3 = s2.upcase # "БОСТОНСКОЕ ЧАЕПИТИЕ"
Метод
capitalize
представляет первый символ строки в верхнем регистре, а все остальные - в нижнем: