Практическая информатика

       

Строки


Другим столь же распространенным классом является класс 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.


Содержание раздела