Object initialization

Prev | Contents | Next

| Ruby user's guide | Object initialization |

Our Fruit class from the previous chapter had two instance variables, one to describe the kind of fruit and another to describe its condition. It was only after writing a custom `inspect` method for the class that we realized it didn't make sense for a piece of fruit to lack those characteristics. Fortunately, ruby provides a way to ensure that instance variables always get initialized.

### The `initialize` method

Whenever Ruby creates a new object, it looks for a method named `initialize` and executes it. So one simple thing we can do is use an `initialize` method to put default values into all the instance variables, so the `inspect` method will have something to say.

    ruby> class Fruit
        |   def initialize
        |     @kind = "apple"
        |     @condition = "ripe"
        |   end
        | end
       nil
    ruby> f4 = Fruit.new
       "a ripe apple"

### Changing assumptions to requirements

There will be times when a default value doesn't make a lot of sense. Is there such a thing as a default kind of fruit? It may be preferable to require that each piece of fruit have its kind specified at the time of its creation. To do this, we would add a formal argument to the `initialize` method. For reasons we won't get into here, arguments you supply to `new` are actually delivered to `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)

### Flexible