Evgenii Legotckoi
26 августа 2016 г. 13:52

User Guide #27 - Ruby - Инициализация объектов

В нашем классе Fruit из предыдущей главы есть @-переменные: первая описывает вид фрукта, вторая - его состояние.  Только после написания своего специализированного метода

  1. inspect
для этого класса, мы осознали, что для любого фрукта отсутствие заданных характеристик бессмысленно.  К счастью, в Ruby есть способ гарантировать, что @-переменные всегда будут инициализированы.

Метод
  1. initialize

Когда Ruby создает новый объект, он ищет в описании класса метод

  1. initialize
и вызывает его.  Таким образов, простая вещь, которую мы можем проделать,- это использовать
  1. initialize
для задания всем @-переменным значений "по-умолчанию", так что теперь "методу
  1. inspect
всегда есть что сказать". ;-)

  1. ruby> **class Fruit**
  2.     |**def initialize**
  3.     |**@kind = "apple"**
  4.     |**@condition = "ripe"**
  5.     |**end**
  6.     | **end**
  7. **nil**
  8. ruby> **f4 = Fruit.new**
  9. **"a ripe apple"**

От предположения к требованию

Бывает, что задавать значения "по-умолчанию" бессмысленно. Существует ли в природе такая вещь, как "фрукт по умолчанию"?  наверное, будет предпочтительно, чтобы вид каждого фрукта задавался во время его создания.  для этого необходимо ввести формальный аргумент в метод

  1. initialize
.  Мы не будем здесь вдаваться в причину почему, но аргументы, которые мы задаем в вызове метода
  1. new
на самом деле передаются в метод
  1. initialize
.

  1. ruby> **class Fruit**
  2.     |**def initialize( k )**
  3.     |**@kind = k**
  4.     |**@condition = "ripe"**
  5.     |**end**
  6.     | **end**
  7. **nil**
  8. ruby> **f5 = Fruit.new "mango"**
  9. **"a ripe mango"**
  10. ruby> **f6 = Fruit.new**
  11. **ERR: (eval):1:in `initialize': wrong # of arguments(0 for 1)**

Гибкая инициализация

Как видно из примера выше, если с методом

  1. initialize
ассоциирован аргумент, то его при создании объекта его нельзя отбросить с тем, чтобы не получить сообщения об ошибке.  Если мы хотим быть деликатнее, то можем использовать аргумент, если он задан, в противном случае откатиться на его значение "по-умолчанию".

  1. ruby> **class Fruit**
  2.     |**def initialize( k="apple" )**
  3.     |**@kind = k**
  4.     |**@condition = "ripe"**
  5.     |**end**
  6.     | **end**
  7. **nil**
  8. ruby> **f5 = Fruit.new "mango"**
  9. **"a ripe mango"**
  10. ruby> **f6 = Fruit.new**
  11. **"a ripe apple"**

Вы можете использовать значения "по-умолчанию" для любых методов, а не только для

  1. initialize
.  Список аргументов должен быть построен так, чтобы аргументы, которые могут иметь значения "по-умолчанию", шли последними.

Иногда полезно дать возможность инициализировать объект несколькими способами.  Хотя это и выходит за рамки данного руководства, Ruby поддерживает reflection объектов и список аргументов переменной длины, которые вместе дают возможность эффективной перезагрузки методов.

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь