s1 = str.chop # 'abcxy'
Поскольку символ новой строки присутствует не всегда, иногда удобнее применять метод chomp
:
str = 'abcxyz'
str2 = '123
'
str3 = '123
'
str4 = '123
'
s1 = str.chomp # 'abcxyz'
s2 = str2.chomp # '123'
# Если установлен стандартный разделитель записей, то удаляется не только
#
, но также
и
.
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 = '
abc
'
str2 = str1.strip # 'abc'
str3 = str1.strip! # 'abc'
#str1 теперь тоже равно 'abc'.
Под пропусками, как обычно, понимаются пробелы, символы табуляции и перевода на новую строку.
Чтобы удалить пропуски только в начале или только в конце строки, применяйте методы lstrip
и rstrip
:
str = ' abc '
s2 = str.lstrip # 'abc '
s3 = str.rstrip # ' abc'
Имеются также варианты lstrip!
и rstrip!
для удаления «на месте».
2.20. Повтор строк
В Ruby оператор (или метод) умножения перегружен так, что в применении к строкам выполняет операцию повторения. Если строку умножить на n, то получится строка, состоящая из n конкатенированных копий исходной:
etc = 'Etc. '*3 # 'Etc. Etc. Etc. '
ruler = ' + ' + ('. '*4+'5' + '.'*4+' + ')*3
# '+....5....+....5....+....5....+'
2.21. Включение выражений в строку
Это легко позволяет сделать синтаксическая конструкция #{}
. Нет нужды думать о преобразовании, добавлении и конкатенации; нужно лишь интерполировать переменную или другое выражение в любое место строки:
puts '#{temp_f} по Фаренгейту равно #{temp_c} по Цельсию'
puts 'Значение определителя равно #{b*b — 4*а*с}.'
puts '#{word} это #{word.reverse} наоборот.'
Внутри фигурных скобок могут находиться даже полные предложения. При этом возвращается результат вычисления последнего выражения.
str = 'Ответ равен #{ def factorial(n)
n==0 ? 1 : n*factorial(n-1)
end
answer = factorial(3) * 7}, естественно.'
# Ответ равен 42, естественно.
При интерполяции глобальных переменных, а также переменных класса и экземпляра фигурные скобки можно опускать:
print '$gvar = #$gvar и ivar = #@ivar.'
Интерполяция не производится внутри строк, заключенных в одиночные кавычки (поскольку их значение не интерпретируется), но применима к заключенным в двойные кавычки встроенным документам и к регулярным выражениям.
2.22. Отложенная интерполяция
Иногда желательно отложить интерполяцию значений в строку. Идеального способа решить эту задачу не существует, но можно воспользоваться блоком:
str = proc {|x,у,z| 'Числа равны #{x}, #{у} и #{z}' }
s1 = str.call(3,4,5) # Числа равны 3, 4 и 5.
s2 = str.call(7,8,9) # Числа равны 7, 8 и 9.
Другое, более громоздкое решение состоит в том, чтобы сохранить строку, заключенную в одиночные кавычки, потом «обернуть» ее двойными кавычками и вычислить:
str = '#{name} - мое имя, а #{nation} - моя родина'
name, nation = 'Стивен Дедал', 'Ирландия'
s1 = eval(''' + str + ''')
# Стивен Дедал - мое имя, а Ирландия - моя родина.
Можно также передать eval
другую функцию привязки:
bind = proc do
name,nation = 'Гулливер Фойл', 'Земля'
binding
end.call # Надуманный пример; возвращает привязанный контекст блока
s2 = eval(''' + str + ''',bind)
# Гулливер Фойл - мое имя, а Земля - моя родина.