It seems that I can never manage to sit through a class at my university without getting sidetracked. One of my favorite diversions is reading through Ruby’s standard library, and today I decided to check out open-uri’s source.

Many of us have used open-uri to open up a web page. I think it’s super cool that something like open("google.com").read magically becomes possible with Tanaka Akira’s library.

However, one thing I never considered was that open-uri could help us open other things too. Take a look at this.

By default, Kernel#open cannot open arbitrary things.

sandal@harmonix:~$ irb --simple-prompt
>> class A
>>   def open
>>     "you opened it!"
>>   end
>> end
=> nil
>> open(A.new)
TypeError: can't convert A into String
        from (irb):6:in `open'
        from (irb):6
        from :0

However, by simply requiring open-uri, you are in business!

>> require "open-uri"
=> true
>> open(A.new)
=> "you opened it!"

Now, I realize that this is far from amazing, but it’s still cool to think that because a lot of ruby code is duck typed really well, you can use it for purposes other than what it is explicitly meant to do.

For the curious, open-uri will cause Kernel#open to accept arguments and a block as well, so feel free to define your open() method in your classes as you please.

So here is a little challenge for those who read this blog… Find something in the standard library that can be used in a different way than it is intended. Post it in the comments here, so people can see just how flexible Ruby really is. :)