# Initializing dynamic instance methods

**URL:** <https://www.ruby-forum.com/t/initializing-dynamic-instance-methods/85555>\
**Category:** Ruby\
**Created:** [February 14, 2007, 3:35pm UTC](https://www.ruby-forum.com/t/initializing-dynamic-instance-methods/85555 "2007-02-14T15:35:37Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Lars\_O](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/91b2a8/32.png) [@Lars\_O](https://www.ruby-forum.com/u/Lars_O)\
**Post date:** [February 14, 2007, 3:35pm UTC](https://www.ruby-forum.com/t/initializing-dynamic-instance-methods/85555/1 "2007-02-14T15:35:37Z")

</div>

Hi list!

What’s the best way to remedy the error/warning that the following  
code produces?

class Parent  
def self.foo()  
module\_eval(“def foo(); @foo; end”)  
module\_eval(“def foo=(newfoo); @foo = newfoo; end”)  
end  
end

class Child \< Parent  
foo  
end

c = Child.new  
p c.foo

(running with ruby -w)  
(eval):1: warning: instance variable @foo not initialized  
nil

Sincerely

/lasso

---

<div class="post-metadata">

**Author:** ![Lars\_O](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/91b2a8/32.png) [@Lars\_O](https://www.ruby-forum.com/u/Lars_O)\
**Post date:** [February 14, 2007, 3:41pm UTC](https://www.ruby-forum.com/t/initializing-dynamic-instance-methods/85555/2 "2007-02-14T15:41:38Z")

</div>

Lars O. schrieb:

> class Child \< Parent  
> foo  
> end
> 
> c = Child.new  
> p c.foo
> 
> (running with ruby -w)  
> (eval):1: warning: instance variable @foo not initialized  
> nil

I don’t know if its the best way, but you could try

module\_eval(“def foo(); @foo if defined? @foo; end”)

Regards,  
Pit

---

<div class="post-metadata">

**Author:** ![Lars\_O](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/91b2a8/32.png) [@Lars\_O](https://www.ruby-forum.com/u/Lars_O)\
**Post date:** [February 14, 2007, 4:15pm UTC](https://www.ruby-forum.com/t/initializing-dynamic-instance-methods/85555/3 "2007-02-14T16:15:41Z")

</div>

On Feb 14, 7:31 am, “Lars O.” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> end  
> I dunno what your criteria is for ‘best’, but this fixes it:  
> module\_eval(“def foo(); @foo ||= nil; end”)  
> (Though that runs over values of false with nil.)

---

<div class="post-metadata">

**Author:** ![Lars\_O](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/91b2a8/32.png) [@Lars\_O](https://www.ruby-forum.com/u/Lars_O)\
**Post date:** [February 14, 2007, 6:51pm UTC](https://www.ruby-forum.com/t/initializing-dynamic-instance-methods/85555/4 "2007-02-14T18:51:09Z")

</div>

Thanks, the worked flawlessly. I just added an else clause so that I  
can have other default values than nil.

class Parent  
def self.foo()  
module\_eval(“def foo(); if defined?(@foo) then @foo else nil  
end; end”)  
module\_eval(“def foo=(newfoo); @foo = newfoo; end”)  
end  
end

class Child \< Parent  
foo  
end

c = Child.new  
p c.foo

/lasso

---

<div class="post-metadata">

**Author:** ![Lars\_O](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/l/91b2a8/32.png) [@Lars\_O](https://www.ruby-forum.com/u/Lars_O)\
**Post date:** [February 15, 2007, 4:35am UTC](https://www.ruby-forum.com/t/initializing-dynamic-instance-methods/85555/5 "2007-02-15T04:35:17Z")

</div>

Phrogz wrote:

> I dunno what your criteria is for ‘best’, but this fixes it:  
> module\_eval(“def foo(); @foo ||= nil; end”)  
> (Though that runs over values of false with nil.)

That’s what I do also; just be careful however not to refer to the  
instance variable _from within_ the class; use the accessor method.
