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

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

···

--
Posted via http://www.ruby-forum.com/.

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 :wink:
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 :wink:

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

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 :slight_smile:

HTH
Robert

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

···

On 7/18/09, Dwight Shackelford <zydeholic@yahoo.com> wrote:

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
--
Posted via 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]

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,

···

--
JJ Fleck

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.

···

--
Posted via http://www.ruby-forum.com/\.