Initialize doesn't appear to get called.
class Object
def initialize
@foo = 'bar'
end
attr_reader :foo
end
a = Object.new # => #<Object:0x54c964 @foo="bar">
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.
···
On Wed, May 27, 2009 at 2:10 AM, Robert Klemme <shortcutter@googlemail.com> wrote:
On 27.05.2009 02:26, Oliver Saunders wrote:
--
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