В нашем классе Fruit из предыдущей главы есть @-переменные: первая описывает вид фрукта, вторая - его состояние. Только после написания своего специализированного метода
для этого класса, мы осознали, что для любого фрукта отсутствие заданных характеристик бессмысленно. К счастью, в Ruby есть способ гарантировать, что @-переменные всегда будут инициализированы.
- inspect
Метод
- initialize
- initialize
Когда Ruby создает новый объект, он ищет в описании класса метод
и вызывает его. Таким образов, простая вещь, которую мы можем проделать,- это использовать
- initialize
для задания всем @-переменным значений "по-умолчанию", так что теперь "методу
- initialize
всегда есть что сказать". ;-)
- inspect
- ruby> **class Fruit**
- |**def initialize**
- |**@kind = "apple"**
- |**@condition = "ripe"**
- |**end**
- | **end**
- **nil**
- ruby> **f4 = Fruit.new**
- **"a ripe apple"**
От предположения к требованию
Бывает, что задавать значения "по-умолчанию" бессмысленно. Существует ли в природе такая вещь, как "фрукт по умолчанию"? наверное, будет предпочтительно, чтобы вид каждого фрукта задавался во время его создания. для этого необходимо ввести формальный аргумент в метод
. Мы не будем здесь вдаваться в причину почему, но аргументы, которые мы задаем в вызове метода
- initialize
на самом деле передаются в метод
- new
.
- initialize
- ruby> **class Fruit**
- |**def initialize( k )**
- |**@kind = k**
- |**@condition = "ripe"**
- |**end**
- | **end**
- **nil**
- ruby> **f5 = Fruit.new "mango"**
- **"a ripe mango"**
- ruby> **f6 = Fruit.new**
- **ERR: (eval):1:in `initialize': wrong # of arguments(0 for 1)**
Гибкая инициализация
Как видно из примера выше, если с методом
ассоциирован аргумент, то его при создании объекта его нельзя отбросить с тем, чтобы не получить сообщения об ошибке. Если мы хотим быть деликатнее, то можем использовать аргумент, если он задан, в противном случае откатиться на его значение "по-умолчанию".
- initialize
- ruby> **class Fruit**
- |**def initialize( k="apple" )**
- |**@kind = k**
- |**@condition = "ripe"**
- |**end**
- | **end**
- **nil**
- ruby> **f5 = Fruit.new "mango"**
- **"a ripe mango"**
- ruby> **f6 = Fruit.new**
- **"a ripe apple"**
Вы можете использовать значения "по-умолчанию" для любых методов, а не только для
. Список аргументов должен быть построен так, чтобы аргументы, которые могут иметь значения "по-умолчанию", шли последними.
- initialize
Иногда полезно дать возможность инициализировать объект несколькими способами. Хотя это и выходит за рамки данного руководства, Ruby поддерживает reflection объектов и список аргументов переменной длины, которые вместе дают возможность эффективной перезагрузки методов.