Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Это не знак табуляции: t
а это не символ новой строки: n
EOF
Если концевому маркеру встроенного документа предшествует дефис, то маркер может начинаться с красной строки. При этом удаляются только пробелы из той строки, на которой расположен сам маркер, но не из предшествующих ей строк документа.
str = <<-EOF
Каждая из этих строк
начинается с пары
пробелов.
EOF
Опишу стиль, который нравится лично мне. Предположим, что определен такой метод
margin
class String
def margin
arr = self.split("n") # Разбить на строки.
arr.map! {|x| x.sub!(/s*|/,"")) # Удалить начальные символы.
str = arr.join("n") # Объединить в одну строку.
self.replace(str) # Подменить исходную строку.
end
end
Для ясности я включил подробные комментарии. В этом коде применяются конструкции, которые будут рассмотрены ниже
—
str = <<end.margin
|Этот встроенный документ имеет "левое поле"
|на уровне вертикальной черты в каждой строке.
|
| Можно включать цитаты,
| делать выступы и т.д.
end
В качестве концевого маркера естественно употребить слово
end
end
2.4. Получение длины строки
Для получения длины строки служит метод
length
size
str1 = "Карл"
x = str1.length # 4
str2 = "Дойль"
x = str2.size # 5
2.5. Построчная обработка
Строка в Ruby может содержать символы новой строки. Например, можно прочитать в память файл и сохранить его в виде одной строки. Применяемый по умолчанию итератор each в этом случае перебирает отдельные строки:
str = "Когда-тоnдавным-давно...nКонецn"
num = 0
str.each do |line|
num += 1
print "Строка #{num}: #{line}"
end
Выполнение этого кода дает следующий результат:
Строка 1: Когда-то
Строка 2: давным-давно...
Строка 3: Конец
Альтернативно можно было бы воспользоваться методом
each_with_index
2.6. Побайтовая обработка
Поскольку на момент написания этой книги язык Ruby еще не поддерживал интернационализацию в полной мере, то символ и байт
—
each_byte
str = "ABC"
str.each_byte {|char| print char, " " }
#Результат: 65 66 67.
В текущей версии Ruby строку можно преобразовать в массив односимвольных строк с помощью метода
scan
str = "ABC"
chars = str.scan(/./)
chars.each {|char| print char, " " }
#Результат: ABC.
2.7. Специализированное сравнение строк
В язык Ruby уже встроен механизм сравнения строк: строки сравниваются в привычном лексикографическом порядке (то есть на основе упорядочения, присущего данному набору символов). Но при желании можно задать собственные правила сравнения любой сложности.
Предположим, например, что мы хотим игнорировать английские артикли a, an и the, если они встречаются в начале строки, а также не обращать внимания на большинство знаков препинания. Для этого следует переопределить встроенный метод
<=>
<
<=
>
>=
class String
alias old_compare <=>
def <=>(other)
a = self.dup
b = other.dup
# Удалить знаки препинания.
a.gsub!(/[,.?!:;]/, "")
b.gsub!(/[,.?!:;]/, "")
# Удалить артикли из начала строки.
a.gsub!(/^(a |an | the )/i, "")
b.gsub!(/^(a |an | the )/i, "")
# Удалить начальные и хвостовые пробелы.
a.strip!
b.strip!
# Вызвать старый метод <=>.
# a.old_compare(b)
end
end
title1 = "Calling All Cars"