# Mutual require problem

**URL:** <https://www.ruby-forum.com/t/mutual-require-problem/54367>\
**Category:** Ruby\
**Created:** [March 2, 2006, 6:50pm UTC](https://www.ruby-forum.com/t/mutual-require-problem/54367 "2006-03-02T18:50:57Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![rdelbru](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/439d5e/32.png) [@rdelbru](https://www.ruby-forum.com/u/rdelbru)\
**Post date:** [March 2, 2006, 6:50pm UTC](https://www.ruby-forum.com/t/mutual-require-problem/54367/1 "2006-03-02T18:50:57Z")

</div>

Hi,

I have a problem with the require method.

First file ‘main.rb’:

> require ‘test’
> 
> class A  
> def self.print  
> p “test”  
> end  
> end
> 
> Test.print

Second file ‘test.rb’:

> require ‘main’
> 
> class Test \< A  
> end

And the result during the execution :  
workspace/test-divers/main.rb:10: uninitialized constant Test  
(NameError)

It’s a simple example to show you the problem, but in a more complex  
program, I have the same problem.  
I think I understand what happen,  
ruby begin to load main.rb, see the require ‘test’,  
try to load test.rb, see the require ‘main’,  
try to load main.rb with success, but when he arrived to  
Test.print, ruby doesn’t finish to load ‘test.rb’ and Test  
become a uninitialized constant.

Thanks if you have a solution or a proposition.

–  
Renaud Delbru

---

<div class="post-metadata">

**Author:** ![rdelbru](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/439d5e/32.png) [@rdelbru](https://www.ruby-forum.com/u/rdelbru)\
**Post date:** [March 2, 2006, 11:39pm UTC](https://www.ruby-forum.com/t/mutual-require-problem/54367/2 "2006-03-02T23:39:11Z")

</div>

Adam S. wrote:

> On 3/2/06, renaud delbru [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:
> 
> > > ```
> > > def self.print
> > > 
> > > ```
> > > 
> > > class Test \< A  
> > > end
> > 
> > And the result during the execution :  
> > workspace/test-divers/main.rb:10: uninitialized constant Test  
> > (NameError)
> 
> Circular requires are a bad thing.  
> See [http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/178329](http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/178329).
> 
> To avoid them, try the ruby equivalent of a forward declaration: In  
> test.rb, replace
> 
> > require ‘main’  
> > with  
> > class A; end

…or, if possible, try to not have both files referencing  
eachother. It is _usually_ not necessary.

> -Adam

E

---

<div class="post-metadata">

**Author:** ![rdelbru](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/439d5e/32.png) [@rdelbru](https://www.ruby-forum.com/u/rdelbru)\
**Post date:** [March 3, 2006, 11:05am UTC](https://www.ruby-forum.com/t/mutual-require-problem/54367/3 "2006-03-03T11:05:35Z")

</div>

Thank you adam for your answers,

I have resolved the problem with a toplevel file which contains  
the sequence of require.

Bye.

–  
Renaud Delbru

---

<div class="post-metadata">

**Author:** ![rdelbru](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/439d5e/32.png) [@rdelbru](https://www.ruby-forum.com/u/rdelbru)\
**Post date:** [March 2, 2006, 8:55pm UTC](https://www.ruby-forum.com/t/mutual-require-problem/54367/4 "2006-03-02T20:55:22Z")

</div>

On 3/2/06, renaud delbru [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > ```
> > def self.print
> > 
> > ```
> > 
> > class Test \< A  
> > end
> 
> And the result during the execution :  
> workspace/test-divers/main.rb:10: uninitialized constant Test  
> (NameError)

Circular requires are a bad thing.  
See [http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/178329](http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/178329).

To avoid them, try the ruby equivalent of a forward declaration: In  
test.rb, replace

> require ‘main’  
> with  
> class A; end

-Adam

---

<div class="post-metadata">

**Author:** ![rdelbru](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/439d5e/32.png) [@rdelbru](https://www.ruby-forum.com/u/rdelbru)\
**Post date:** [March 3, 2006, 1:28pm UTC](https://www.ruby-forum.com/t/mutual-require-problem/54367/5 "2006-03-03T13:28:46Z")

</div>

Another useful technique here is autoloading.  
There are cases where require is needed, but in general autoload is much  
better.  
Looser coupling, less memory use, faster programs.

Cheers,

Han H.
