From: Devin Mullins Date: 2006-09-05T23:00:00+09:00 Subject: Re: times is a method? gaurav bagga wrote: > thanks all for the help > > 5 =MyNum.new > > i wanted to do this just to have fun as most of the classes in ruby are > open > String,Array... to be extended was trying same with Fixnum...... if > possible.... Ah. Well, you can touch Fixnum, but there's not much you can do with 5. irb(main):001:0> class Fixnum; def squared; self * self end end => nil irb(main):002:0> puts (1..10).map {|i| i.squared}.join(', ') 1, 4, 9, 16, 25, 36, 49, 64, 81, 100 => nil irb(main):003:0> def 5.foo; end SyntaxError: compile error (irb):3: parse error, unexpected tINTEGER def 5.foo; end ^ (irb):3: parse error, unexpected kEND, expecting $ from (irb):3 irb(main):004:0> a = 5 => 5 irb(main):005:0> def a.foo; end TypeError: can't define singleton method "foo" for Fixnum from (irb):5 irb(main):006:0> 5.instance_eval { @bar = 'quux' } => "quux" irb(main):007:0> 5.instance_variable_get :@bar => "quux" irb(main):008:0> 6.instance_eval { @bar } => nil irb(main):009:0> "sdgsdg".object_id => 23037396 irb(main):010:0> "sdgsdg".object_id => 21070012 irb(main):011:0> "sdgsdg".object_id => 21055864 irb(main):012:0> 5.object_id => 11 irb(main):013:0> 5.object_id => 11 irb(main):014:0> 5.object_id => 11 In the last bit, notice how the String object_ids are all divisible by four. That's Ruby's cue that they're Real Objects, and object_id >> 2 is the start of the memory location they've been alloc'ed (IIRC). That 5 has an object_id not divisible by four is Ruby's cue that it's not a real object -- actually, that it's odd is Ruby's cue that its a Fixnum. irb(main):015:0> (-1000..1000).all? {|i| i == i.object_id >> 1} => true See, with Fixnums, no object is actually alloc'ed and pointed to. The pointer *is* an encoding of the number. Hence, no singleton methods for you. Odd that you can define instance variables, but I'm sure if I bothered to read the Ruby source, it'd make perfect sense. Devin