Строки
Другим столь же распространенным классом является класс String. К этому классу относятся произвольные строки символов, заключенные в апострофы или кавычки, например, 'hello', 'раз, два, три', "привет всем". Есть несколько альтернативных способов задания каждого из этих видов строк.
Для задания строки в апострофах можно использовать любой из способов представленных ниже.
puts 'hello' # hello puts %q/hello/ # hello puts %q(hello) # hello
Два подряд идущих символа \ внутри такой строки заменяются на один.
puts 'hell\\o' # hell\o puts %q(hell\\o) # hell\o
Для того чтобы внутрь строки, заключенной в апострофы, вставить апостроф, следует предварительно "экранировать" его символом \ (обратный слеш).
puts 'hell\'o' # hell'o puts %q(hell\'o) # hell\'o puts 'hel"l"o' # hel"l"o
Для создания строки, заключенной в кавычки, следует либо просто заключить ее в кавычки, либо использовать конструкции %Q или %, после которых указывается строка, обрамленная с двух сторон одним и тем же символом, отличным от цифр и букв (можно использовать также пару любых скобок). Ниже перечислено несколько способов задания строки "hello".
"hello" %Q/hello/ %Q{hello} %Q(hello) %Q!hello! %<hello> %(hello) %!hello! %*hello* %+hello+
puts "Say \"Hello\"" # Say "Hello"
Строка, заключенная в кавычки, позволяет интерпретировать последовательности символов, начинающиеся с символа \ такие, например, как \n (символ перехода на новую строку) и \t (табуляция). Другой особенностью строк, заключенных в кавычки, является возможность использования подстановки: если строка содержит некоторое выражение, ограниченное символами #{ и }, то оно заменяется на результат его вычисления. Добавьте в программу следующие строки и проанализируйте полученный вывод.
puts "a \t b"; puts 'a \t b' puts "выражение 3*5+8 равно #{3*5+8}" puts 'выражение 3*5+8 равно #{3*5+8}' puts "работа с целыми числами: 5/8 = #{5/8}" puts "перевод в класс Float: 5/8 = #{5/8.to_f}"
К строкам могут применяться методы to_i и to_f. При преобразовании к целому числу отбрасывается оставшаяся часть строки, как только встречается символ, отличный от цифры (исключение - знак плюс или минус в первой позиции строки). Аналогичные правила применяются и при преобразовании к дробному числу. Единственным отличием является то, что первая найденная точка рассматривается как разделитель между целой и дробной частями. Следующий фрагмент иллюстрирует сказанное:
puts "-12.34".to_i puts "12.34".to_f puts "+12:34".to_i puts "12qq34".to_f
Для получения строки, содержащей символ с заданным ASCII кодом, используется метод chr, например,
puts 209.chr
Следует помнить, что этот метод может быть применен только к положительному целому числу, не превышающему 255.
Класс String предоставляет большое число методов для работы со строками, некоторые из которых представлены в следующей таблице.
+ | Сцепление строк "мол" + "око" | "молоко" |
* | Повтор строки "ab" * 3 | "ababab" |
[ ] | Возвращает ASCII-код символа, находящегося на указанной позиции строки (отсчет начинается с нуля) "abcdef"[0] "abcdef"[0].chr | 97 "a" |
[нач..кон] | Возвращает подстроку, заключенную в указанном диапазоне (включая концы) "abcdef"[0..3] | "abcd" |
[нач, дл] | Возвращает подстроку, начинающуюся с указанной позиции и имеющую заданную длину "abcdef"[0,3] | "abc" |
capitalize | Заменяет первый символ строки (если он является буквой латинского алфавита) на заглавную "abc".capitalize | "Abc" |
chop | Удаляет указанные символы из строки, может указываться диапазон изменения символов "abcdef".delete('ea') "abcdef".delete('a-c') | "bcdf" "def" |
index | Определяет номер позиции, с которой начинается указанная подстрока; можно указывать номер позиции, с которой начинается поиск "abcdabcd".index("cd") "abcdabcd".index("cd",3) | 2 6 |
length size | Определяют длину строки (в байтах) "12345678".length "12345678".size | 8 8 |
ljust rjust center | Дополняют строку пробелами до указанной ширины, выравнивая соответственно по левому краю, по правому краю или по центру "123".ljust(8) "123".rjust(8) "123".center(8) | "123 " " 123" " 123 " |
reverse | Возвращает строку, содержащую символы в обратном порядке "1234567".reverse | "7654321" |
strip | Удаляет пробелы в начале и конце строки " 123 ".strip | "123" |
squeeze | Оставляет в группе повторяющихся символов только один; допускается задание списка символов, на которых распространяется данное действие "22---23**".squeeze "22---23**".squeeze('*-') | "2-23*" "22-23*" |
tr | Заменяет все найденные вхождения символов на заданные "22+33=55".tr('25','47') | "44+33=77" |
Отдельного упоминания заслуживает метод eval, позволяющий динамически выполнять другие методы. Этот метод анализирует переданную ему строку, рассматривая ее как часть программы, и выполняет ее. Обратите внимание, что при вызове этого метода используется не точечная, а функциональная форма записи:
puts eval("2**10") puts eval(""мол".size * "око".size') # 9
Пример 1.3.
(html, txt)
Отдельного упоминания заслуживает метод eval, позволяющий динамически выполнять другие методы. Этот метод анализирует переданную ему строку, рассматривая ее как часть программы, и выполняет ее. Обратите внимание, что при вызове этого метода используется не точечная, а функциональная форма записи:
puts eval("2**10") puts eval(""мол".size * "око".size') # 9#!/usr/bin/env ruby
puts 'hello' # hello puts %q/hello/ # hello puts %q(hello) # hello
puts 'hell\\o' # hell\o puts %q(hell\\o) # hell\o
puts 'hell\'o' # hell'o puts %q(hell\'o) # hell\'o puts 'hel"l"o' # hel"l"o
puts "hello" puts %Q/hello/ puts %Q!hello! puts %Q{hello} puts %Q(hello) puts %Q!hello! puts %<hello> puts %!hello! puts %*hello* puts %+hello+ puts %(hello)
puts "Say \"Hello\"" # Say "Hello" puts "Say 'Hello'" # Say 'Hello'
puts "a \t b" puts 'a \t b' puts "выражение 3*5+8 равно #{3*5+8}" puts 'выражение 3*5+8 равно #{3*5+8}' puts "работа с целыми числами: 5/8 = #{5/8}" puts "перевод в класс Float: 5/8 = #{5/8.to_f}"
puts "-12.34".to_i puts "12.34".to_f puts "+12:34".to_i puts "12qq34".to_f
puts 209.chr
puts "123456789".reverse puts " 123 " puts " 123 ".strip puts "---22--23****".squeeze('*-') puts "---22--23****".squeeze
puts "Дашка любит молоко, а Танька - квас".tr('ДТ','МД') puts "22+33=55".tr('25','47')
puts "abcdef"[0].chr puts "abcdef".chop puts "abcdef".chop.chop puts "abcdef".delete("ea") puts "abcdef".delete('a-c') puts "abcdefabcdef".length puts "12345678".size
puts "ABCDEF".downcase puts "abcdef".index("cd") puts "abcdefabcdef".index("cd",3)
a="12345" puts "12345"[3].chr puts "12345"[0..3] puts "12345"[0,3]
puts "привет".capitalize # Не работает с русскими буквами! puts "abcdabcd".index("cd",3) puts "*"+"123".ljust(9)+*" puts "*"+"123".center(9)+"*" puts "*"+"123".rjust(9)+"*"
puts (eval "2**10") puts (eval ""мол".size * "око".size')
=begin s="2*3+4" puts s puts "#{s}" puts eval(s) puts eval s
puts s.eval # Ошибка! Неправильный вызов метода
print "Введите команды:" eval gets.chop! =end
Пример 1.3.