[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Having problems with my instance variable

macaco

2/5/2008 2:14:00 AM

[Note: parts of this message were removed to make it a legal post.]

I'm sorry if this question seem stupid, but couldn't find it in the books.

I have this code in the models directory:
class Figure
attr_reader :xpos, :ypos

def initialize
@xpos = 0
@ypos = 0
@other = 0
@another = 0
end

def some
call_other(@xpos,@ypos)
end

def more
call_other(@other,@another)
end

def call_other(var1, var2)
max = 9
var1= rand(max)
var2=rand(max)
end
end


And have this on my controller:

def figure
fig = Figure.new
fig.some
render :text => "<h1>new values</h1>"+fig.xpos.to_s+" "+fig.ypos.to_s
end

Problem is, it always print 0 0... as if the random wouldn't work, but I
have test the random outside this method (calling it in the first method,
not the second one), but the second method is one I need cos I use it too
many times and with different instance variables

Any help?

4 Answers

Day

2/5/2008 3:29:00 AM

0

[Note: parts of this message were removed to make it a legal post.]

On Feb 4, 2008 8:14 PM, macaco <macacoangel@gmail.com> wrote:

> def some
> call_other(@xpos,@ypos)
> end
>
> def more
> call_other(@other,@another)
> end
>
> def call_other(var1, var2)
> max = 9
> var1= rand(max)
> var2=rand(max)
> end
> end
>

It's not clear to me what you're trying to do here. You want a method that
will set arbitrary variables to random numbers? That's a wild guess. What
you're actually doing when you call call_other is passing it the values in
@xpos and @ypos (which is 0 and 0 initially). Then, in call_other, you're
taking those 0s in with var1 and var2. Then you're over-writing var1 and
var2 with random numbers (0s are lost, as far as this method is concerned)
and then... you exit. You're leaving your @vars untouched because you're
passing the values, not the variables themselves.

If "max" is always going to be the same, I'd make it a constant at the class
level and then just have some look like this:

def some
@xpos = rand MAX
@ypos = rand MAX
end

If max won't be the same all the time, make a method that figures it out and
returns a random number based on it... An example will make more sense,
maybe.

def some
@xpos = generate_random
@ypos = generate_random
end

def generate_random
max = 9 # or whatever determines your max value
rand(max)
end

I hope that's clear. Scope can be confusing sometimes. If I am too rambly (I
hear that a lot), maybe someone with more experience will be more clear,
too.


Ben

Andrew Stone

2/5/2008 4:03:00 AM

0

[Note: parts of this message were removed to make it a legal post.]

> def some
> call_other(@xpos,@ypos)
> end
>
> def more
> call_other(@other,@another)
> end
>

This worked:
class Test
attr_reader :xpos

def initialize
@xpos = 0
end

def some
p "before call: #{@xpos}"
#notice the colon
c :@xpos
p "after call: #{@xpos}"
end

def call_other(var)
max = 9
self.instance_variable_set(var, rand(max))
end
end

begin
t = Test.new
t.some
end

wyz@local ~ $ ruby test.rb
"before call: 0"
"after call: 7"

wyz@local ~ $ ruby test.rb
"before call: 0"
"after call: 2"

Warning: I'm not feeling well and the NyQuil is kicking in... :/

--
Andrew Stone

macaco

2/5/2008 5:37:00 PM

0

[Note: parts of this message were removed to make it a legal post.]

Thanks Day, but this is just a simplification of what I need

@Andrew Stone, thanks instance_variable_set makes it's work, but what if i
need the data inside too... for example

def call_other(var1,var2)
max = 8
if(var1 == 0)
var1 = rand max
else
var1 += max
end
var2 = rand max
end


BTW, can you explain the line of code "c :@xpos", didn't get it

Thanks again

On Feb 4, 2008 11:03 PM, Andrew Stone <stonelists@gmail.com> wrote:

> > def some
> > call_other(@xpos,@ypos)
> > end
> >
> > def more
> > call_other(@other,@another)
> > end
> >
>
> This worked:
> class Test
> attr_reader :xpos
>
> def initialize
> @xpos = 0
> end
>
> def some
> p "before call: #{@xpos}"
> #notice the colon
> c :@xpos
> p "after call: #{@xpos}"
> end
>
> def call_other(var)
> max = 9
> self.instance_variable_set(var, rand(max))
> end
> end
>
> begin
> t = Test.new
> t.some
> end
>
> wyz@local ~ $ ruby test.rb
> "before call: 0"
> "after call: 7"
>
> wyz@local ~ $ ruby test.rb
> "before call: 0"
> "after call: 2"
>
> Warning: I'm not feeling well and the NyQuil is kicking in... :/
>
> --
> Andrew Stone
>

Day

2/5/2008 7:16:00 PM

0

[Note: parts of this message were removed to make it a legal post.]

On Feb 5, 2008 11:37 AM, macaco <macacoangel@gmail.com> wrote:

> @Andrew Stone, thanks instance_variable_set makes it's work, but what if i
> need the data inside too...
>

I think instance_variable_get? Check out http://www.ruby-doc... and
look in the right column for methods that start with instance_v. Or do a
find on _variable and see what turns up.


Ben