Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

• Не путайте операторы диапазона

..
и
...
— первый включает верхнюю границу, второй исключает. Так, диапазон
5..10
включает число 10, а диапазон
5...10
— нет.

• С диапазонами связана одна мелкая деталь, которая может вызвать путаницу. Если дан диапазон

m..n
, то метод
end
вернет конечную его точку
n
, равно как и его синоним
last
. Но те же методы возвращают значение
n
и для диапазона
m...n
, хотя
n
не включается в него. Чтобы различить эти две ситуации, предоставляется метод
end_excluded?
.

• Не путайте диапазоны с массивами. Следующие два присваивания абсолютно различны:

x = 1..5

x = [1, 2, 3, 4, 5]

Однако есть удобный метод

to_a
для преобразования диапазона в массив. (Во многих других типах тоже есть такой метод.)

• Часто бывает необходимо присвоить переменной значение лишь в том случае, когда у нее еще нет никакого значения. Поскольку «неприсвоенная» переменная имеет значение

nil
, можно решить эту задачу так:
x = x || 5
или сокращенно
x ||= 5
. Имейте в виду, что значение
false
, а равно и
nil
, будет при этом перезаписано.

• В большинстве языков для обмена значений двух переменных нужна дополнительная временная переменная. В Ruby наличие механизма множественного присваивания делает ее излишней: выражение

x, y = y, x
обменивает значения
x
и
y
.

• Четко отличайте класс от экземпляра. Например, у переменной класса

@@foobar
областью видимости является весь класс, а переменная экземпляра
@foobar
заново создается в каждом объекте класса.

• Аналогично метод класса ассоциирован с тем классом, в котором определен; он не принадлежит никакому конкретному объекту и не может вызываться от имени объекта. При вызове метода класса указывается имя класса, а при вызове метода экземпляра - имя объекта.

• В публикациях, посвященных Ruby, часто для обозначения метода экземпляра применяют решеточную нотацию. Например, мы пишем

File.chmod
, чтобы обозначить метод
chmod
класса
File
, и
File#chmod
для обозначения метода экземпляра с таким же именем. Эта нотация не является частью синтаксиса Ruby. Мы старались не пользоваться ей в этой книге.

• В Ruby константы не являются истинно неизменными. Их нельзя изменять в теле методов экземпляра, но из других мест это вполне возможно.

• Ключевое слово

yield
пришло из языка CLU и некоторым программистам может быть непонятно. Оно используется внутри итератора, чтобы передать управление блоку, с которым итератор был вызван. В данном случае
yield
не означает, что нужно получить результат или вернуть значение. Скорее, речь идет о том, чтобы уступить процессор для работы.

• Составные операторы присваивания

+=
,
– =
и пр. — это не методы (собственно, это даже не операторы). Это всего лишь «синтаксическая глазурь» или сокращенная форма записи более длинной формы. Поэтому
x += y
значит в точности то же самое, что
x = x + y
. Если оператор
+
перегружен, то оператор
+=
«автоматически» учитывает новую семантику.

• Из-за того, как определены составные операторы присваивания, их нельзя использовать для инициализации переменных. Если первое обращение к переменной

x
выглядит как
x += 1
, возникнет ошибка. Это интуитивно понятно для программистов, если только они не привыкли к языку, в котором переменные автоматически инициализируются нулем или пустым значением.

• Такое поведение можно в некотором смысле обойти. Можно определить операторы для объекта

nil
, так что в случае, когда начальное значение переменной равно
nil
, мы получим желаемый результат. Так, метод
nil.+
, приведенный ниже, позволит инициализировать объект типа
string
или
Fixnum
, для чего достаточно вернуть аргумент
other
. Таким образом,
nil + other
будет равно
other
.

def nil.+(other)

 other

end

Мы привели этот код для иллюстрации возможностей Ruby, но стоит ли поступать так на практике, оставляем на усмотрение читателя.

• Уместно будет напомнить, что

Class
это объект, a
Object
— это класс. Мы попытаемся прояснить этот вопрос в следующей главе, а пока просто повторяйте это как мантру.

• Некоторые операторы нельзя перегружать, потому что они встроены в сам язык, а не реализованы в виде методов. К таковым относятся

=
,
..
,
...
,
and
,
or
,
not
,
&&
,
||
,
!
,
!=
и
!~
. Кроме того, нельзя перегружать составные операторы присваивания (
+=
,
– =
и т.д.). Это не методы и, пожалуй, даже не вполне операторы.

• Имейте в виду, что хотя оператор присваивания перегружать нельзя, тем не менее возможно написать метод экземпляра с именем

fоо=
(тогда станет допустимым предложение
x.foo = 5
). Можете рассматривать знак равенства как суффикс.

• Напомним: «голый» оператор разрешения области видимости подразумевает наличие

Object
перед собой, то есть
::Foo
— то же самое, что
Objеct::Foo
.

• Как уже говорилось,

fail
— синоним
raise
.

• Напомним, что определения в Ruby исполняются. Вследствие динамической природы языка можно, например, определить два метода совершенно по-разному в зависимости от значения признака, проверяемого во время выполнения.

• Напомним, что конструкция

for (for x in а)
на самом деле вызывает итератор
each
. Любой класс, в котором такой итератор определен, можно обходить в цикле
for
.

• Не забывайте, что метод, определенный на верхнем уровне, добавляется в модуль

Kernel
и, следовательно, становится членом класса
Object
.

• Методы установки (например,

fоо=
) должны вызываться от имени объекта, иначе анализатор решит, что речь идет о присваивании переменной с таким именем.

• Напомним, что ключевое слово

retry
можно использовать в итераторах, но не в циклах общего вида. В контексте итератора оно заставляет заново инициализировать все параметры и возобновить текущую итерацию с начала.

• Ключевое слово

retry
применяется также при обработке исключений. Не путайте два этих вида использования.

Поделиться:
Популярные книги

Последний Паладин. Том 5

Саваровский Роман
5. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 5

Глава рода

Шелег Дмитрий Витальевич
5. Живой лёд
Фантастика:
боевая фантастика
6.55
рейтинг книги
Глава рода

Барон

Первухин Андрей Евгеньевич
5. Ученик
Фантастика:
фэнтези
5.60
рейтинг книги
Барон

Барон Бранд Берс. Том 1

Limonad
1. Бранд Берс
Проза:
магический реализм
5.00
рейтинг книги
Барон Бранд Берс. Том 1

Три Меченосца. Книга первая. Желтая сталь алфейнов

Маягин Владимир
Хроники Гэмдровса
Фантастика:
фэнтези
эпическая фантастика
героическая фантастика
боевая фантастика
6.33
рейтинг книги
Три Меченосца. Книга первая. Желтая сталь алфейнов

Барон Бранд Берс. Том 3

Limonad
3. Бранд Берс
Проза:
магический реализм
5.00
рейтинг книги
Барон Бранд Берс. Том 3

Экспансия — II

Семенов Юлиан Семенович
11. Штирлиц
Детективы:
исторические детективы
7.78
рейтинг книги
Экспансия — II

Воплощение Похоти

Некрасов Игорь
1. Воплощение Похоти
Фантастика:
юмористическое фэнтези
попаданцы
рпг
аниме
5.00
рейтинг книги
Воплощение Похоти

Наследие Маозари 9

Панежин Евгений
9. Наследие Маозари
Фантастика:
попаданцы
постапокалипсис
рпг
сказочная фантастика
6.25
рейтинг книги
Наследие Маозари 9

Камень Книга седьмая

Минин Станислав
7. Камень
Фантастика:
фэнтези
боевая фантастика
6.22
рейтинг книги
Камень Книга седьмая

Ассасин

Сухов Евгений Евгеньевич
Я – вор в законе
Детективы:
боевики
7.08
рейтинг книги
Ассасин

Последний реанорец. Том XII – Часть II

Павлов Вел
12. Высшая Речь
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний реанорец. Том XII – Часть II

Журнал «Если», 2007 № 04

Олди Генри Лайон
4. Журнал "Если" 2007
Фантастика:
научная фантастика
7.00
рейтинг книги
Журнал «Если», 2007 № 04

Малафрена

Ле Гуин Урсула Кребер
Фантастика:
альтернативная история
5.00
рейтинг книги
Малафрена