В нашем классе Fruit из предыдущей главы есть @-переменные: первая описывает вид фрукта, вторая - его состояние. Только после написания своего специализированного метода
inspectдля этого класса, мы осознали, что для любого фрукта отсутствие заданных характеристик бессмысленно. К счастью, в Ruby есть способ гарантировать, что @-переменные всегда будут инициализированы.
Метод
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 объектов и список аргументов переменной длины, которые вместе дают возможность эффективной перезагрузки методов.