Вход/Регистрация
Программирование на языке Ruby
вернуться

Фултон Хэл

Шрифт:

• В большинстве языков для обмена значений двух переменных нужна дополнительная временная переменная. В 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
применяется также при обработке исключений. Не путайте два этих вида использования.

  • Читать дальше
  • 1
  • ...
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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