Evgenii Legotckoi
Там. 26, 2016, 1:52 Т.Қ.

Пайдаланушы нұсқаулығы №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 объектов и список аргументов переменной длины, которые вместе дают возможность эффективной перезагрузки методов.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз