Ну а если объект не отвечает на вызов метода to_str
to_s
; можно проверить, принадлежит ли объект классу String
или его подклассу; можно, наконец, продолжать работать, понимая, что при попытке выполнить операцию, которую объект не поддерживает, мы получим исключение ArgumentError
.Короткий путь к цели выглядит так:
title = title.to_str rescue title
Он опирается на тот факт, что при отсутствии реализации метода to_str
rescue
могут быть вложенными:title = title.to_str rescue title.to_s rescue title
# Обрабатывается маловероятный случай, когда отсутствует даже метод to_s.
С помощью неявного преобразования можно было бы сделать строки и числа практически эквивалентными:
class Fixnum
def to_str
self.to_s end
end
str = "Число равно " + 345 # Число равно 345.
Но я не рекомендую так поступать: «много хорошо тоже нехорошо». В Ruby, как и в большинстве языков, строки и числа — разные сущности. Мне кажется, что ясности ради преобразования, как правило, должны быть явными.
И еще: в методе to_str
2.17. Дописывание в конец строки
Для конкатенации строк применяется оператор <<
str = "А"
str << [1,2,3].to_s << " " << (3.14).to_s
# str теперь равно "А123 3.14".
Если число типа Fixnum
str = "Marlow"
str << 101 << ", Christopher"
# str теперь равно "Marlowe, Christopher".
2.18. Удаление хвостовых символов новой строки и прочих
Часто бывает необходимо удалить лишние символы в конце строки. Типичный пример — удаление символа новой строки после чтения строки из внешнего источника.
Метод chop
\r
), он тоже удаляется. Причина такого поведения заключается в том, что разные операционные системы неодинаково трактуют понятие «новой строки». В UNIX-подобных системах новая строка представляется символом \n
. А в DOS и Windows для этой цели используется пара символов \r\n
.str = gets.chop # Прочитать, удалить символ новой строки.
s2 = "Some string\n" # "Some string" (нет символа новой строки).
s3 = s2.chop! # s2 теперь тоже равно "Some string".
s4 = "Other string\r\n"
s4.chop! # "Other string" (нет символа новой строки).
Обратите внимание, что при вызове варианта chop!
Важно еще отметить, что последний символ удаляется, даже если это не символ новой строки:
str = "abcxyz"
s1 = str.chop # "abcxy"
Поскольку символ новой строки присутствует не всегда, иногда удобнее применять метод chomp
str = "abcxyz"
str2 = "123\n"
str3 = "123\r"
str4 = "123\r\n"
s1 = str.chomp # "abcxyz"
s2 = str2.chomp # "123"
# Если установлен стандартный разделитель записей, то удаляется не только
# \n, но также \r и \r\n.
s3 = str3.chomp # "123"
s4 = str4.chomp # "123"
Как и следовало ожидать, имеется также метод chomp!
chomp
передана строка-параметр, то удаляются перечисленные в ней символы, а не подразумеваемый по умолчанию разделитель записей. Кстати, если разделитель записей встречается в середине строки, то он не удаляется:str1 = "abcxyz"
str2 = "abcxyz"
s1 = str1.chomp("yz") # "abcx"
s2 = str2.chomp("x") # "abcxyz"
2.19. Удаление лишних пропусков
Метод strip
strip!
делает то же самое «на месте».str1 = "\t \nabc \t\n"
str2 = str1.strip # "abc"