[Ironruby-core] A nicer syntax for generic extension methods

Ivan Porto Carrero ivan at whiterabbitconsulting.eu
Wed Feb 3 00:40:27 EST 2010


just pass your block to the constructor of a delegate and you should be good
to go

Action.new { more_work_here }
---
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 Tue, Feb 2, 2010 at 11:38 PM, Ryan Riley <ryan.riley at panesofglass.org>wrote:

> That's fantastic, Tomas, thanks! Is there any way to pass a block, lambda,
> or Proc into the slot for the delegate, or perhaps a way to create a .NET
> delegate (or Expression) from a block, lambda, or Proc?
>
> Thanks,
>
> Ryan Riley
>
> Email: ryan.riley at panesofglass.org
> LinkedIn: http://www.linkedin.com/in/ryanriley
> Blog: http://wizardsofsmart.net/
> Twitter: @panesofglass
> Website: http://panesofglass.org/
>
>
> On Tue, Feb 2, 2010 at 1:36 AM, Tomas Matousek <
> Tomas.Matousek at microsoft.com> wrote:
>
>> Actually, you can add Ruby methods to List<T> … IronRuby type system does
>> some magic for you J:
>>
>>
>>
>> >>> include System::Collections::Generic
>>
>> => Object
>>
>> >>> List[Fixnum].included_modules
>>
>> => [System::Collections::Generic::List[T],
>> System::Collections::Generic::IList[Fixnum],
>> System::Collections::Generic::IList[T],
>> System::Collections::Generic::ICollection[Fixnum],
>> System::Collections::Generic::ICollection[T],
>> System::Collections::Generic::IEnumerable[Fixnum],
>> System::Collections::Generic::IEnumerable[T],
>> System::Collections::IEnumerable, Enumerable, System::Collections::IList,
>> System::Collections::ICollection, System::Collections::Generic, Kernel]
>>
>>
>>
>> As you can see the List<> generic type definition is treated as a module
>> that is mixed in each of its instantiations. Although there are no
>> predefined methods on it you can open it and add some. First we need to get
>> Ruby class for List<T>. If you index System.Collections.Generic.List by a
>> fixnum instead of a class/module you’ll get the generic definition of arity
>> 1. Let’s name it ListOfT:
>>
>>
>>
>> >>> ListOfT = List[1]
>>
>>
>>
>> And then we can open it up:
>>
>>
>>
>> >>> module ListOfT
>>
>> ...   def size
>>
>> ...     count
>>
>> ...   end
>>
>> ... end
>>
>> => nil
>>
>> >>> l = List[Fixnum].new
>>
>> => []
>>
>> >>> l.add(1)
>>
>> => nil
>>
>> >>> l.add(2)
>>
>> => nil
>>
>> >>> l.size
>>
>> => 2
>>
>>
>>
>> Tomas
>>
>>
>>
>>
>>
>> *From:* ironruby-core-bounces at rubyforge.org [mailto:
>> ironruby-core-bounces at rubyforge.org] *On Behalf Of *Orion Edwards
>> *Sent:* Monday, February 01, 2010 6:31 PM
>> *To:* ironruby-core at rubyforge.org
>> *Subject:* Re: [Ironruby-core] A nicer syntax for generic extension
>> methods
>>
>>
>>
>> IIRC you can open "concrete" generics, but not "open" ones: In plain
>> english this means you can add methods to List<string> but not List<T>.
>>
>>
>>
>> This is essentially because List<T> isn't a real type in the CLR, it's
>> basically some metadata that can be used to build a real type when the T is
>> supplied.
>>
>>
>>
>> You could as an alternative add methods to the underlying non-generic
>> IEnumerable interface, but then you'd have to do some run-time reflection to
>> figure out that your List is actually a List<string>... This is probably not
>> nice.
>>
>>
>>
>> In theory when CLR4 lands and has support for co/contra variant generics,
>> List<object> should match List<string> and everything else, but I don't know
>> if IronRuby would also work for this?
>>
>>
>>
>> Good luck
>>
>> On Tue, Feb 2, 2010 at 7:52 AM, Ryan Riley <ryan.riley at panesofglass.org>
>> wrote:
>>
>> I have been trying to figure out how to Rubify generic extension methods
>> for use with the likes of Rx, Open XML SDK, etc. Ivan went over it a bit
>> with me this weekend, but I'm still having difficulty including a module
>> within a .NET type. Is that even possible?
>>
>>
>>
>> ...
>>
>>
>>
>> The questions I'm not able to answer are:
>>
>>    1. Can I somehow open up a .NET class, say
>>    System::Collections::Generic::List[T] and include the EnumerableExtensions?
>>    So far, I'm finding that's a no.
>>    2. How do I hook in the included(base) method above? I'm assuming
>>    that's a one-time call, but I don't see anywhere that it's called when a
>>    module is included. Do I need to use a before_filter or perform that action
>>    at the beginning of the linq_select method?
>>
>>
>>
>> Thanks!
>>
>>
>> Ryan Riley
>>
>> Email: ryan.riley at panesofglass.org
>> LinkedIn: http://www.linkedin.com/in/ryanriley
>> Blog: http://wizardsofsmart.net/
>> Twitter: @panesofglass
>> Website: http://panesofglass.org/
>>
>> _______________________________________________
>> 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/20100203/a767eac5/attachment.html>


More information about the Ironruby-core mailing list