[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Re: Event handling

Aa Aa

5/8/2008 5:42:00 AM

Oke, I've implemented the following observer/listener program:

class Cow
def initialize
@listeners = Array.new
end

def add_listener(listener)
raise ArgumentError if !listener.respond_to?(:sound_event) &&
!listeners.include?(listener)
@listeners << listener
end

def remove_listener(listener)
@listeners.delete(listener)
end

def notify_listeners
for i in 0...@listeners.length
@listeners[i].sound_event('MHOEEEE')
end
end

def be_happy
notify_listeners
end
end

class Program
def sound_event(value)
puts value
end

def start
cow = Cow.new
cow.add_listener(self)
cow.be_happy
end
end

Program.new.start

Is this an appropriate way of doing event handling in ruby?
--
Posted via http://www.ruby-....

3 Answers

Shawn Anderson

5/8/2008 7:12:00 AM

0

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

This seems like a decent approach; maintaining a list of listeners and
notifying them. A few notes:
for i in 0...@listeners.length
@listeners[i].sound_event('MHOEEEE')
end

Closures or blocks in ruby are perfect for this:
@listeners.each do |listener|
listener.sound_event 'MHOEEEE'
end

to get cool eventing like:

@car.when :crashing do
jump_out
end
I recommend looking at Publisher:
http://rubyforge.org/projects/atomi...


On Wed, May 7, 2008 at 10:42 PM, Aa Aa <banditgsf600n@hotmail.com> wrote:

> Oke, I've implemented the following observer/listener program:
>
> class Cow
> def initialize
> @listeners = Array.new
> end
>
> def add_listener(listener)
> raise ArgumentError if !listener.respond_to?(:sound_event) &&
> !listeners.include?(listener)
> @listeners << listener
> end
>
> def remove_listener(listener)
> @listeners.delete(listener)
> end
>
> def notify_listeners
> for i in 0...@listeners.length
> @listeners[i].sound_event('MHOEEEE')
> end
> end
>
> def be_happy
> notify_listeners
> end
> end
>
> class Program
> def sound_event(value)
> puts value
> end
>
> def start
> cow = Cow.new
> cow.add_listener(self)
> cow.be_happy
> end
> end
>
> Program.new.start
>
> Is this an appropriate way of doing event handling in ruby?
> --
> Posted via http://www.ruby-....
>
>

George Malamidis

5/8/2008 8:26:00 AM

0

Hello,

You can also have listeners register blocks to certain events instead
of implementing a specific method like "sound_event". That way you
publisher can be more decoupled from the listeners' implementation.
Have a look at http://nutrun.com/weblog/event...

Thanks,
George

On 8 May 2008, at 08:11, wrote:

> This seems like a decent approach; maintaining a list of listeners and
> notifying them. A few notes:
> for i in 0...@listeners.length
> @listeners[i].sound_event('MHOEEEE')
> end
>
> Closures or blocks in ruby are perfect for this:
> @listeners.each do |listener|
> listener.sound_event 'MHOEEEE'
> end
>
> to get cool eventing like:
>
> @car.when :crashing do
> jump_out
> end
> I recommend looking at Publisher:
> http://rubyforge.org/projects/atomi...
>
>
> On Wed, May 7, 2008 at 10:42 PM, Aa Aa <banditgsf600n@hotmail.com>
> wrote:
>
>> Oke, I've implemented the following observer/listener program:
>>
>> class Cow
>> def initialize
>> @listeners = Array.new
>> end
>>
>> def add_listener(listener)
>> raise ArgumentError if !listener.respond_to?(:sound_event) &&
>> !listeners.include?(listener)
>> @listeners << listener
>> end
>>
>> def remove_listener(listener)
>> @listeners.delete(listener)
>> end
>>
>> def notify_listeners
>> for i in 0...@listeners.length
>> @listeners[i].sound_event('MHOEEEE')
>> end
>> end
>>
>> def be_happy
>> notify_listeners
>> end
>> end
>>
>> class Program
>> def sound_event(value)
>> puts value
>> end
>>
>> def start
>> cow = Cow.new
>> cow.add_listener(self)
>> cow.be_happy
>> end
>> end
>>
>> Program.new.start
>>
>> Is this an appropriate way of doing event handling in ruby?
>> --
>> Posted via http://www.ruby-....
>>
>>


Aa Aa

5/8/2008 4:50:00 PM

0

Thanks, I'll check both of the suggested techniques.

--
Posted via http://www.ruby-....