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 [email protected]

    @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

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 S. [email protected] wrote:

confused.
MAXAGE = 10

    if !(@age < MAXAGE)
    if @numFruit > 0

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,

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.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs