On Sat, May 16, 2009 at 3:32 PM, Dave Birch <thisisdaveb / gmail.com> wrote: > Hi, > > I'm a ruby nuby and I'm confused about something. ¨Âèåôòôï ãòåáôå > a singleton method for a BigDecimal like so: > > require 'bigdecimal' > d = BigDecimal.new('10') > > class << d > ¨Âåæ öáìõ> 2 > ¨Âîä > end > > p.value > > I get an error: > singtest.rb:7:in `singleton_method_added': can't define singleton method > "value" for BigDecimal (TypeError) > > Doing this through IRB, I was surprised that if I then ran... > > d.singleton_methods.sort > > ...after getting the error above, I get "value" listed as a singleton > method, and indeed, d.value yields 32. > > If I wrap the singleton method definition in a begin...rescue block, the > TypeError is caught and not displayed, and the singleton method is > accessible. > > If I replace d = BigDecimal.new('10') with d = String.new('10'), but > leave the rest of the code the same, I don't get the error and the > singleton method works as expected. ¨Âôèåòóïíåôèéîóéíðìå ɧ> missing? > The Numeric class overrides singleton_method_added to raise an error $ ri -T Object#singleton_method_added ------------------------------------------ Object#singleton_method_added singleton_method_added(symbol) From Ruby 1.8 ------------------------------------------------------------------------ Invoked as a callback whenever a singleton method is added to the receiver. module Chatty def Chatty.singleton_method_added(id) puts "Adding #{id.id2name}" end def self.one() end def two() end def Chatty.three() end end _produces:_ Adding singleton_method_added Adding one Adding three $ ri -T Numeric#singleton_method_added ----------------------------------------- Numeric#singleton_method_added singleton_method_added(p1) From Ruby 1.8 ------------------------------------------------------------------------ Trap attempts to add methods to +Numeric+ objects. Always raises a +TypeError+ I guess this is to avoid surprises since certain kinds of numerics can't have singleton methods (e.g. Fixnums which because of their implementation don't have a klass pointer so can't acquire a singleton class). So it wouldn't make sense to be able to add a singleton method to 100 factorial (a Bignum), but not to 100 (a Fixnum). However, the singleton_method_added callback happens after the method has been added so it's kind of like locking the barn door after the horse has left. -- Rick DeNatale Blog: http://talklikeaduck.denhaven2.com/ Twitter: http://twitter.com/RickDeNatale WWR: http://www.workingwithrails.com/person/9021-rick-denatale LinkedIn: http://www.linkedin.com/in/rickdenatale