From: Rick DeNatale Date: 2009-05-27T21:54:56+09:00 Subject: Re: Initialize not being called on objects created from literals On Wed, May 27, 2009 at 2:10 AM, Robert Klemme wrote: > On 27.05.2009 02:26, Oliver Saunders wrote: >> >> Initialize doesn't appear to get called. >> >> class Object >>  def initialize >>    @foo = 'bar' >>  end >>  attr_reader :foo >> end >> >> a = Object.new # => # >> a.foo # => "bar" >> 'string'.foo # => nil >> //.foo # => nil >> >> I want to have //.foo and 'string.foo give me "bar" as they should. How >> can I do that? > > A class needs to explicitly invoke #initialize of the super class.  I guess, > since Object does not have any members by default String will not do the > invocation. This is true, see below > > class A >  def initialize >    puts "A" >  end > end > > class B < A >  def initialize >    super >    # or super() in this case >    puts "B" >  end > end > > Having said that, it's generally not a too good idea to mess with built in > classes - even though you can.  But you may produce unwanted side effects. But that's not the whole story. As the OP suspected, literals are created by the parser without going through the normal initialization route: class Object alias_method :old_initialize, :initialize attr_reader :boo def initialize(*args, &b) # !> redefining Object#initialize may cause infinite loop puts "Object#initialize" old_initialize(*args, &b) @boo = "who" end end puts "calling String.new" s1 = String.new puts "back" puts "s1.boo is #{s1.boo.inspect}" puts "making String#initialize call super" class String alias_method :old_initialize, :initialize def initialize(*args, &b) super puts "String#initialize" old_initialize(*args, &b) end end puts "calling String.new" s2 = String.new puts "s2.boo is #{s2.boo.inspect}" puts "\"abc\".boo is #{"abc".boo.inspect}" Produces the following calling String.new back s1.boo is nil making String#initialize call super calling String.new Object#initialize String#initialize s2.boo is "who" "abc".boo is nil untitled:5: warning: redefining Object#initialize may cause infinite loop Note that warning pointing out a potential unwanted side effect. -- 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