DrBenway
1/28/2008 12:42:00 PM
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 :)