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)

# Гулливер Фойл - мое имя, а Земля - моя родина.

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату