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

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 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ÃÂbord ñÕdes enfants, mais peu
dÃÆntre elles sÃÆn souviennent.

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

[Antoine de Saint-ExupñÓy]