# Undefined method \`\*' for nil:NilClass (NoMethodError)

**URL:** <https://www.ruby-forum.com/t/undefined-method-for-nil-nilclass-nomethoderror/172289>\
**Category:** Ruby\
**Created:** [July 18, 2009, 6:08pm UTC](https://www.ruby-forum.com/t/undefined-method-for-nil-nilclass-nomethoderror/172289 "2009-07-18T18:08:16Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![dwightschrute](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/e9bcb4/32.png) [@dwightschrute](https://www.ruby-forum.com/u/dwightschrute)\
**Post date:** [July 18, 2009, 6:08pm UTC](https://www.ruby-forum.com/t/undefined-method-for-nil-nilclass-nomethoderror/172289/1 "2009-07-18T18:08:16Z")

</div>

First off, I’m a student taking Ruby for the first time, so bear with  
me. I’ve tried doing a web search and a search of this forum, and  
didn’t see anything that addressed this specifically.

on line 18 of the following code (@height = @height \* 1.1 in the method  
oneYearPasses), I get the error message that is in the subject line.

If I take that same line of code and put it up in the area where I’m  
defining variables, there is no error. I’m suspecting something has  
gone amiss in my method definition and the interpreter is getting  
confused.

If I comment out that line, I get similar messages for my ‘\>’ operators  
below that.

Probably a bump from you folks on that first problem will give me enough  
info to solve the others as they come up. Any help appreciated.  
Thanks.

class OrangeTree  
@numFruit =0  
MAXAGE = 10  
FIRSTFRUIT = 20  
FIRSTHEIGHT = 3.0  
@age = 0  
@dead = false

```
 @height = FIRSTHEIGHT

def getHeight
  return @height
end

def oneYearPasses
  if !@dead

    @height = @height * 1.1 #<<<<<<<<<<<< line causing error
    @age++

    if @age >= 3
      @numFruit = (1.2**(age -3)) * FIRSTFRUIT
    end

    if !(@age < MAXAGE)
      @dead = true
    end
  end
end

def countTheOranges
    return @numFruit
end

def pickAnOrange
    if @numFruit > 0
      @numFruit--
      puts {'That was delicious'}
    else
      puts {'There are no more oranges'}
    end
end

```

end

myTree = OrangeTree.new  
myTree.oneYearPasses  
myTree.oneYearPasses  
myTree.pickAnOrange  
myTree.getHeight

---

<div class="post-metadata">

**Author:** ![dwightschrute](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/e9bcb4/32.png) [@dwightschrute](https://www.ruby-forum.com/u/dwightschrute)\
**Post date:** [July 18, 2009, 6:53pm UTC](https://www.ruby-forum.com/t/undefined-method-for-nil-nilclass-nomethoderror/172289/2 "2009-07-18T18:53:59Z")

</div>

The problem here is instance variable scope.

You define instance variables on the class object not the instance.  
Try to find David Black’s excellent post some days ago about what he  
thinks is the most important thing for beginners to know, know your  
self. (as says Delphi’s oracle already 😉  
In other words know what self is in any moment, let us try to explore  
and you will find it quite simple:

502/3 \> ruby -e ‘class A; p self end’  
A

ok in the class declaration part self is the class A object, now:

504/5 \> ruby -e ‘class A; def a; p self end end; A::new.a’  
#\<A:0x81babb8\>

Aha, in a method self is an instance object of the class A

Now let us have a look at how this fits with instance variables

507/8 \> ruby -e ‘class A; @a=42; end; p A.instance\_variable\_get( :@a  
); p A::new.instance\_variable\_get( :@a )’  
42  
nil

ok that explains your error, you @height was nil (an uninitialised  
ivar (1) ) that did not have the method “\*”

Now how can we fix it?

When Ruby creates a new object with A::new it  
(i) creates a new object with allocate  
(ii) invokes the initialize method with all its own parameters on the  
object from (i)  
(iii) returns the object from (i)

Thus initialize gives us the self you need 😉

508/9 \> ruby -e ‘class A; @a=42; def initialize; @a=41 end end; p  
A.instance\_variable\_get( :@a ); p A::new.instance\_variable\_get( :@a )’  
42  
41

I know those one liners are unreadable, thus please refer to:  
[http://pastie.org/550502](http://pastie.org/550502)

All you need to do now, is to define a method called initialize in  
your class and copy  
the ivar initialization code from your class body into the initialize  
method, where self is what you want it to be 🙂

HTH  
Robert

(1) Hint: Running ruby with -w (default in 1.9) might have given you a  
good clue.

On 7/18/09, Dwight S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> confused.  
> MAXAGE = 10
> 
> ```
> if !(@age < MAXAGE)
> if @numFruit > 0
> 
> ```
> 
> ## myTree.oneYearPasses myTree.pickAnOrange myTree.getHeight
> 
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).

–  
Toutes les grandes personnes ont d’abord été des enfants, mais peu  
d’entre elles s’en souviennent.

All adults have been children first, but not many remember.

[Antoine de Saint-Exupéry]

---

<div class="post-metadata">

**Author:** ![dwightschrute](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/e9bcb4/32.png) [@dwightschrute](https://www.ruby-forum.com/u/dwightschrute)\
**Post date:** [July 18, 2009, 7:05pm UTC](https://www.ruby-forum.com/t/undefined-method-for-nil-nilclass-nomethoderror/172289/3 "2009-07-18T19:05:41Z")

</div>

Hello Dwight,

> on line 18 of the following code (@height = @height \* 1.1 in the method  
> oneYearPasses), I get the error message that is in the subject line.

As Robert told, you just have to add

class OrangeTree  
MAXAGE = 10  
FIRSTFRUIT = 20  
FIRSTHEIGHT = 3.0

def initialize  
@numFruit =0  
@age = 0  
@dead = false  
@height = FIRSTHEIGHT  
end

…  
end

And it will (almost) work. Note that the construct ‘++’ as in @age++  
does not exist in ruby, neither does the construct ‘–’, you will have  
to write explicitly  
@age += 1  
and  
@numFruit -= 1

Cheers,

---

<div class="post-metadata">

**Author:** ![dwightschrute](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/e9bcb4/32.png) [@dwightschrute](https://www.ruby-forum.com/u/dwightschrute)\
**Post date:** [July 18, 2009, 7:21pm UTC](https://www.ruby-forum.com/t/undefined-method-for-nil-nilclass-nomethoderror/172289/4 "2009-07-18T19:21:46Z")

</div>

> And it will (almost) work. Note that the construct ‘++’ as in @age++  
> does not exist in ruby, neither does the construct ‘–’, you will have  
> to write explicitly  
> @age += 1  
> and  
> @numFruit -= 1
> 
> Cheers,

Thank you very much, both of you.

Yes, I figured I was using other languages mixed in. Studying too many  
languages at the same time, and already know some others. I was just  
going to have the debugger tell me what doesn’t work.
