On Jan 25, 10:11 pm, Philipp Hofmann <p... / s126.de> wrote: > hi, > > ok let's code a zoo. threads is what you are looking for, but there > might be a better way. but threads first. > > class Animal > > def initialize > @lifetime_in_sec = 0 > @dead = false > thread = Thread.new do > until @dead > @lifetime_in_sec += 1 > sleep 1 > end > end > end > > def kill > @dead = true > end > > end > > depending on your zoo this might lead to a lot of threads, so maybe > you should think about using a more event-based design. (make the egg > by initialization register a 'timed' event to become a biddy.) > > shutdown = true > $events = Hash.new { |hash, key| hash[key] = [] } > $time = 0 > > class Animal > def initialize > $events[$time+time_to_become_a_biddy] << self > end > def progress > # become a biddy or chicken or ... > $events[$time+time_to_become_a_chicken] << self if @state==:biddy > end > end > > event_handler = Thread.new do > counter = 0 > until shutdown > counter += 1 > $events[counter].each { |animal| animal.progress } > end > end > > this way your simulation is calucaluatet as fast as possible and you > can throttle it to be realtime. asuming your machine is fast enough > for your zoo. ;) > > g phil > > On Sat, Jan 26, 2008 at 05:19:58AM +0900, DrBenway wrote: > > On Jan 25, 8:27 pm, Stephen Kratzer <kratz... / pa.net> 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 Thnx for the example Philipp. The first one I get, but the second makes my head spin ^_^ To much of a Ruby/OOP noob I guess :)