[Ironruby-core] Getting a delegate in IronRuby

Ivan Porto Carrero ivan at flanders.co.nz
Tue Aug 4 19:43:43 EDT 2009


Out of curiosity why, for C# to consume?

Ruby doesn't have an event syntax, it's an add-on for CLR interop.
In Ruby you would probably want to use an observable implementation and you
could, if you want to do so, add the add_event_handler and
remove_event_handler methods.
You probably know this already but ruby has a built-in Observable mixin that
implements most of it for you. If you want to mimic .NET events you'll need
a custom implementation that notifies the observers and includes the sender.

module Observable

    #
    # Add +observer+ as an observer on this object. +observer+ will now receive
    # notifications. +observer+ is interested in the specified +event+
    #
    def add_observer(event, &observer)

      @observers = [] unless defined? @observers
      unless observer.respond_to? :call
        raise NoMethodError, "observer needs to respond to 'update'"
      end
      @observers << { :event => event, :observer => observer }

    end

    #
    # Delete +observer+ as an observer on this object. It will no longer receive
    # notifications of the specified +event+.
    #
    def delete_observer(event, &observer)
      evt = { :event => event, :observer => observer }

      @observers.delete evt if defined? @observers
    end

    #
    # Delete all observers associated with this object.
    #
    def delete_observers
      @observers.clear if defined? @observers

    end

    #
    # Return the number of observers associated with this object.
    #
    def count_observers
      if defined? @observers
        @observers.size
      else
        0
      end

    end

    #
    # Notifies the registered observers that some interesting
    # +event+ has occurred. It will notify the interested parties
    # by calling the block and passing it some context
    #

    def notify_observers(event, sender, *args)
      @observers.select {|evt| evt[:event] == event }.each {|evt|
evt[:observer].call sender, *args } unless count_observers.zero?
    end


  end



---
Met vriendelijke groeten - Best regards - Salutations
Ivan Porto Carrero
Blog: http://flanders.co.nz
Twitter: http://twitter.com/casualjim
Author of IronRuby in Action (http://manning.com/carrero)



On Wed, Aug 5, 2009 at 1:21 AM, Martin Smith <martin.smith.jr at gmail.com>wrote:

> Thanks. Part of this question was also about returning and creating
> RubyEvent objects.  Is there a way to declare an event on the ruby side
> without a "RubyEvent" object?
>
> Thanks,
> Martin
>
>
>
> On Tue, Aug 4, 2009 at 12:39 PM, Tomas Matousek <
> Tomas.Matousek at microsoft.com> wrote:
>
>> BTW:
>>
>>
>>
>> Instead of using Reflection
>>
>>
>>
>> click_event = button.GetType.get_event("Click")
>> on_click = EventHandler.new { |sender, e| puts "Click!" }
>> click_event.add_event_handler(button, on_click)
>>
>>
>>
>> you can do
>>
>>
>>
>> handler = lambda { |sender, e| puts “Click!” }
>>
>> button.on_click.add handler
>>
>> button.on_click.remove handler
>>
>>
>>
>> or just
>>
>>
>>
>> button.on_click { |sender, e| puts “Click!” }
>>
>>
>>
>> if you don’t need to remove the handler.
>>
>>
>>
>> Tomas
>>
>>
>>
>>
>>
>> *From:* ironruby-core-bounces at rubyforge.org [mailto:
>> ironruby-core-bounces at rubyforge.org] *On Behalf Of *Jimmy Schementi
>> *Sent:* Tuesday, August 04, 2009 12:15 PM
>>
>> *To:* ironruby-core at rubyforge.org
>> *Subject:* Re: [Ironruby-core] Getting a delegate in IronRuby
>>
>>
>>
>> I believe that commit is the one that didn't get into the binary build of
>> 0.9.0, but is (strange enough) tagged with 0.9 in GitHub. Thanks for
>> pointing that out though.
>>
>>
>>
>> *From:* ironruby-core-bounces at rubyforge.org [mailto:
>> ironruby-core-bounces at rubyforge.org] *On Behalf Of *Martin Smith
>> *Sent:* Tuesday, August 04, 2009 12:05 PM
>> *To:* ironruby-core at rubyforge.org
>> *Subject:* Re: [Ironruby-core] Getting a delegate in IronRuby
>>
>>
>>
>> Thank you all for your suggestions. They've been most helpful. I think
>> i've mostly wrapped my head around event handlers.  Here's one last
>> question.  What's the best way to test if a given object is an event?
>> Obviously the way below: (object.GetType.get_event("EventName") != nil) is
>> one way, but is there a more efficient (more rubonic) way?
>>
>> I've tried:
>>
>> button = Button.new
>> button.click # => IronRuby.Builtins.RubyEvent
>> # I cant test against IronRuby::Builtins::RubyEvent, because it's not
>> defined
>> button.click.is_a?(System::EventHandler)
>> # error, about TypeGroups
>> button.click.is_a?(System::EventHandler[]) # false
>>
>> As an aside, I looked at the changelog for, 0.9.0 and saw this:
>>
>>        2) Implements TypeGroup#[] overload taking a Fixnum. This is useful when one
>>
>>                  needs to select a generic type definition out of a group of types. For example,
>>                        given three classes C:
>>
>>                       public class C {
>>
>>
>>                         public virtual int Arity { get { return 0; } }
>>                       }
>>                       public class C<T> {
>>
>>                         public virtual int Arity { get { return 1; } }
>>
>>
>>                       }
>>                       public class C<T,S> {
>>                         public virtual int Arity { get { return 2; } }
>>                       }
>>
>>                       p C[0]  # => C
>>
>>
>>                       p C[1]  # => C[T]
>>                       p C[2]  # => C[T, S]
>>
>>
>> However, this fails:
>>
>> System::EventHandler[0] # invalid value for class: 0
>>
>> You guys have been super helpful.  It's really great to see such an active
>> and great community forming around IronRuby.
>>
>> Thanks,
>> Martin
>>
>> On Mon, Aug 3, 2009 at 6:52 PM, Ray Vernagus <r.vernagus at gmail.com>
>> wrote:
>>
>> ** I tried sending this much earlier but my message didn't go through **
>>
>> Hi, Martin--
>>
>> Here's a short example that might illustrate what you're trying to
>> accomplish:
>>
>> require "System.Windows.Forms"
>> include System
>> include System::Windows::Forms
>>
>> button = Button.new
>>
>> click_event = button.GetType.get_event("Click")
>>
>> on_click = EventHandler.new { |sender, e| puts "Click!" }
>>
>> click_event.add_event_handler(button, on_click)
>>
>> button.perform_click # Click!
>>
>> click_event.remove_event_handler(button, on_click)
>>
>> button.perform_click
>>
>> More canonical examples of using events in IronRuby are found here:
>> http://www.ironruby.net/Documentation/.NET/Events
>>
>> --Ray
>>
>> On Mon, Aug 3, 2009 at 2:46 PM, Martin Smith <martin.smith.jr at gmail.com>
>> wrote:
>>
>> Hello,
>>
>> I was wondering how I can get a delegate in IronRuby.
>>
>> One thing I was thinking about doing was trying to attach an event handler
>> with an EventInfo and it requires a delegate.  It has a method called
>> AddEventHandler(object, Delegate), and i wanted to attach an event handler.
>>
>> But I can't find any way to get a delegate in ruby.  How would you guys do
>> it?
>>
>> I know i can also use:
>>
>> object.send(event_name) { |*e| ...... }
>>
>> In that case how would i remove that event handler?
>>
>> Thanks in advance,
>> Martin
>>
>> _______________________________________________
>> Ironruby-core mailing list
>> Ironruby-core at rubyforge.org
>> http://rubyforge.org/mailman/listinfo/ironruby-core
>>
>>
>>
>> _______________________________________________
>> Ironruby-core mailing list
>> Ironruby-core at rubyforge.org
>> http://rubyforge.org/mailman/listinfo/ironruby-core
>>
>>
>>
>> _______________________________________________
>> Ironruby-core mailing list
>> Ironruby-core at rubyforge.org
>> http://rubyforge.org/mailman/listinfo/ironruby-core
>>
>>
>
> _______________________________________________
> Ironruby-core mailing list
> Ironruby-core at rubyforge.org
> http://rubyforge.org/mailman/listinfo/ironruby-core
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/ironruby-core/attachments/20090805/44c3c7c0/attachment.html>


More information about the Ironruby-core mailing list