This post originated from an RSS feed registered with Ruby Buzz
by Daniel Berger.
Original Post: Beware of extending numbers
Feed Title: Testing 1,2,3...
Feed URL: http://djberg96.livejournal.com/data/rss
Feed Description: A blog on Ruby and other stuff.
Never assume you have a Bignum, because you never know if your users are using a 32 or 64 bit version of Ruby. This bit Guillaume Pierronnet, where his mp3info package creates a "NumericBits" module, and later he extends instances of Bignum with it.
Works fine using 32 bit Ruby. Chokes horribly using 64 bit Ruby because the value returned is a Fixnum, which is an immediate type. You can't extend immediate types in Ruby, or so I'm told. You end up with a "can't define singleton method" error. In any case, the better solution is to take advantage of Ruby's open classes:
class Fixnum
def bits
"hello!"
end
end
7.bits # hello!
Mind you, my gut feeling is that the implementation could be changed to allow Fixnum to be extended, so I'll have to ask about that on the Sydney mailing list.