« Back to Log

Rubyblood through your .NET veins

Posted by alexis reigel on April 07, 2008

No other programming language has been syntactically as nice as ruby. Ruby is fully object oriented, most other languages appear to be not so consistent, especially when it comes to primitive data types vs classes. In ruby, everything is an object, in many other object oriented language this is not the case. Most of them have primitive data types besides classes, which means that you cannot necessarily call methods on all types. And, ruby's syntax lets you write much functionality with little code.

But ruby is not alone, .NET is catching up a bit with each release. Now with version 3.5, M$ has introduced extension methods. They allow to extend classes dynamically, without the need to subclass.

My first thought was, let's .NET look more like ruby, in respect to its fully ojbect oriented data types. In ruby you could write 2.times {...} to create a neat loop. In .NET, this is now possible too! You just have to write a static class with static methods, where its first paramater is prefixed with this. The first parameter defines the class type the method is added to. That's it. You can even overload methods. And, the newly created methods popup in intellisense!

Extension methods - intellisense

2.Times? The rubyists among you know where this is going...

Example 1: Extend String class

Let's extend the string class with an overloaded Replace-Method that performs a regexp replace.

 
public static class StringExtensions
{
    public static string Replace(this string stringRef, string pattern, string replace, RegexOptions options)
    {
        return Regex.Replace(stringRef, pattern, replace);
    }
}
 
Call it like this:
 
public class Program
{
    private static void Main(string[] args)
    {
        string stringOrig = "this is stupid.";
        string stringReplaced = stringOrig.Replace(@"(this) is ([^\.]+)\.", "$1 is not $2!", RegexOptions.None);
        Console.WriteLine(string.Format("Orginal string: {0}\nReplaced string: {1}", stringOrig, stringReplaced));
        Console.ReadLine();
    }
}
 

Pretty neat so far huh? But now, let's face the 2.times code.

Example 2: Create a ruby style iterator
 
public static class IntegerExtensions
{
    public delegate void IntegerExtensionsDelegate(int intRef);

    public static bool IsEven(this int intRef)
    {
        return intRef % 2 == 0;
    }

    public static void Times(this int intRef, IntegerExtensionsDelegate invokeMethod)
    {
        for (int i = 0; i < intRef; ++i)
        {
            invokeMethod(i);
        }
    }
}
 
Let's call it now:
 
public class Program
{
    private static void Main(string[] args)
    {
        /* ruby heart beats faster */
        if (2.IsEven())
        {
            Console.WriteLine("Number 2 is even!");
        }
        Console.WriteLine("And now: 2 times loop"); 
        /* ruby heart collapses in bliss */
        2.Times(delegate(int number) { Console.WriteLine("> " + number); });
        Console.ReadLine();
    }
}
 

The Times method almost looks like a ruby iterator with a block assigned. Instead of having a block, we just pass a anonymous method (aka. delegate) to the Times method, and we pretty much get what we wanted.

If you're interested in details on the compiler output, you can read about it on Scott Hanselmann's Computer Zen.

No comments registered

Random Quote

In archaeology you uncover the unknown. In diplomacy you cover the known.

Thomas Pickering

» ...

koffeinfrei on identi.ca

icon
2012-02-01 09:13:03
wrote a short post about capistrano deployment for a sinatra app, summing up the scattered documentation... http://identi.ca/url/65862527
icon
2012-01-27 16:25:29
stop internet #censorship, sleazy bastard #acta http://www.stopp-acta.info, it's not over #sopa
icon
2012-01-27 14:04:03
wat! on ruby and javascript. hilarious: http://identi.ca/url/64793583
icon
2011-12-29 23:23:20
nice: "git meld" enables "git diff" in external diff viewer http://identi.ca/url/63405956
icon
2011-12-04 21:29:39
test runs & cats & rainbows. genius. http://identi.ca/url/61578085
icon
2011-11-23 22:28:55
vimtutor: a really great intro to vi(m).
icon
2011-11-23 22:25:40
RT @thoughtbot "The vim learning curve is a myth." http://t.co/mgBCxJQW
icon
2011-11-16 13:36:29
@Spotify services that require a facebook account shall all die a painful death!
icon
2011-10-31 22:29:17
"Wish you could write your Ruby in XML? Has the fact that Ruby is not “enterprise” got you down?" http://identi.ca/url/56208722
icon
2011-10-14 21:28:44
Attending "A Free Digital Society - Richard Stallman" http://identi.ca/url/54104004
icon
2011-09-30 15:29:15
... and the standalone .net library too: http://ur1.ca/593sg
icon
2011-09-30 15:28:05
gave up waiting for the broken minus api v1 to get fixed, updated the library myself -> new minus share version: http://ur1.ca/593q3
icon
2011-09-28 21:08:31
"User-Led Innovation Can't Create Breakthroughs; Just Ask Apple and Ikea" http://identi.ca/url/39222176
icon
2011-09-28 20:38:50
"Logging out of Facebook is not enough" http://nikcub.appspot.com/logging-out-of-facebook-is-not-enough
icon
2011-09-22 07:10:58
nice mobile emulator (chrome extension) http://ripple.tinyhippos.com/download
icon
2011-09-15 11:03:48
"hello world" in trollscript :-) "Because Brainfuck is so last year, right?": http://tinyurl.com/3twg2xp
icon
2011-09-10 21:31:07
8. bottom line from @frontendconfch #fec11: auto-reload firefox page with guard-mozrepl https://github.com/guard/guard-mozrepl
icon
2011-09-10 21:27:59
7. bottom line from @frontendconfch #fec11: no more inspiration @smashingmag http://ustre.am/:19ZEP
icon
2011-09-10 21:27:45
6. bottom line from @frontendconfch #fec11: css3 for backgrounds @LeaVerou http://ustre.am/:19Z2a (47:22)
icon
2011-09-10 21:27:28
5. bottom line from @frontendconfch #fec11: more cursors in css3 @LeaVerou http://ustre.am/:19Z2a (32:55)
icon
2011-09-10 21:27:05
4. bottom line from @frontendconfch #fec11: css3 gradients @LeaVerou http://ustre.am/:19Z2a (36:10)
icon
2011-09-10 21:26:47
3. bottom line from @frontendconfch #fec11: custom checkboxes in css3 @LeaVerou http://ustre.am/:19Z2a (28:18)
icon
2011-09-10 21:26:27
2. bottom line from @frontendconfch #fec11: javascript unit testing with buster.js @cjno http://ustre.am/:1a01x
icon
2011-09-10 21:25:52
1. bottom line from @frontendconfch #fec11: make designs in the browser, not in photoshop! @bastianallgeier @LeaVerou @jng5 @smashingmag
icon
2011-08-25 21:34:27
Andrew Lawrence: "I admire these phone hackers. I think they have a lot of patience. I can't even be bothered to check my OWN voicemails."
icon
2011-08-25 21:02:59
Why MSTest is the IE6 of unit test frameworks: http://osherove.com/blog/2011/8/24/why-mstest-is-the-ie6-of-unit-test-frameworks.html
icon
2011-08-15 11:41:28
great advertising... http://www.youtube.com/watch?v=rJRiz9aSHFQ
icon
2011-08-05 10:43:52
My diploma work was published as a book: http://tinyurl.com/3ujy8db. A bit outdated matter though...
icon
2011-07-20 14:28:24
how standards proliferate: http://xkcd.com/927/
icon
2011-05-10 12:06:13
#minusshare was added to the official min.us tools page: http://min.us/pages/tools
icon
2011-02-19 01:25:04
Share files on min.us from windows explorer context menu: https://github.com/koffeinfrei/MinusShare
icon
2011-02-01 21:32:52
[zueribad-wintray] http://bit.ly/eBD2LT lex - fixed license file
icon
2011-01-30 19:46:28
[zueribad-wintray] http://bit.ly/dZ02k8 Alexis Reigel - * release 0.1.3
icon
2011-01-30 19:46:24
[zueribad-wintray] http://bit.ly/h30HJw Alexis Reigel - * updated icon * added license and autostart to setup
icon
2011-01-29 23:05:38
[zueribad-wintray] http://bit.ly/fLoUAB Alexis Reigel - * version 0.1.2
icon
2011-01-18 08:12:19
Used to working on a terminal (linux)? Windows console sucks. http://tinyurl.com/23ll4l a pretty decent windows console replacement.
icon
2010-11-30 18:29:10
Jason Fried: Why work doesn't happen at work: http://www.youtube.com/watch?v=5XD2kNopsUs
icon
2010-09-12 13:40:22
[batchreplacer] http://bit.ly/cCYITS koffeinfrei - 3 commits
icon
2010-07-26 11:46:49
Everybody needs a fishbowl: “YouTube - Barry Schwartz: The paradox of choice” — http://www.youtube.com/watch?v=VO6XEQIsCoM
icon
2010-06-18 09:07:19
@kentbrew: what i'm i missing? the #identica-badge doesn't show my entries on http://koffeinfrei.org/
icon
2010-06-16 08:00:30
“YouTube - BP Spills Coffee” — http://www.youtube.com/watch?v=2AAa0gd7ClM
icon
2010-06-01 20:03:29
"The surprising truth about what motivates us”: http://www.youtube.com/watch?v=u6XAPnuFjJc&feature=player_embedded

Ying and Yang

where I am
where I should be
Fork me on GitHub