Re: to sleep no more



On Friday 25 January 2008 15:19:58 DrBenway wrote:
On Jan 25, 8:27 pm, Stephen Kratzer <kratz...@xxxxxx> wrote:
On Friday 25 January 2008 13:25:00 DrBenway wrote:
hi all,

I'm a ruby noop trying his first steps. I'd like a little advice.

What I want to make is the following.

An object Chicken
- its attribute starts as 'egg'
- after x times sleep() it the attribute gets the value chicken
- x times sleep later the object can make a call to make a new
instance of chicken (creating another egg)

I could make a method to change the attribute and call this from my
main program.
In other words my sleep method would be in my main program and call
the objects method.
I was wondering if it would be possible to keep the sleep in the
object.
(Since I was planning on creating some other animals as well, each
with a special amount of time needed to go to the next step.)

I think it's called threads in ruby but I'm not sure. (if it's called
threads is this the way to handle this problem? Does it act like an
Ajax call?)

Many thnx

DrBenway

Something like this might work for your purposes:

class Animal
attr_reader :incubation_period, :maturation_period, :from_type,

:to_type, :current_type, :slept, :children

def initialize(i_period = 60, m_period = 120, from = "egg", to
= "chicken")
@incubation_period = i_period
@maturation_period = m_period
@slept = 0
@from_type = from
@to_type = to
@current_type = @from_type
@children = []
end

def mysleep(seconds = @incubation_period)
@slept += sleep(seconds)
if @slept >= @incubation_period
@current_type = @to_type
end
end

def give_birth(count = 1)
if @slept >= @maturation_period
for number in children.length..(children.length +
count - 1)
puts "I had another child."
children[number] =
Animal.new(@incubation_period, @maturation_period, @from_type, @to_type);
end
else
puts "I'm too young to give birth."
end
end
end

snake = Animal.new(5, 10, "egg", "snake")
snake.mysleep(4)
puts snake.current_type
snake.give_birth
snake.mysleep(4)
puts snake.current_type
snake.give_birth
snake.mysleep(4)
puts snake.current_type
snake.give_birth(5)

Wow thnx Stephen for coocking up an example so fast :)
That's indeed what I was planning to do.

The only thing that may not have been very obvious (sorry for this) in
my example above was:
Is there a way to take the snake.mysleep(4) out of our main program
and put it in the class/object itself
That way I call snake = Animal.new(5, 10, "egg", "snake") once and
from then on it leads a life on its own (that's what got me to think
that I needed threads).
Same goes for all the other snakes that get born from the first.
I don't feel like messing with arrays of
snakes,pigs,boars,chickens,... out of the classes

Ah, now I understand. Yes, if you want each Animal to be able to run through
its lifecycle independently and concurrently, you'd need to use threads. The
example class above would be simplified by the fact that each Animal would be
responsible for its own lifecycle. The constructor would just need to sleep
for the incubation period, update its current type, sleep for the maturation
period minus the incubation period (if any), give birth (spawning other
threads and creating other Animals), and then die at some point. You can find
some info on using threads in Ruby here:
http://www.ruby-doc.org/docs/ProgrammingRuby/

Stephen Kratzer
Network Engineer
CTI Networks, Inc.

.



Relevant Pages