Mutual require problem


#1

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


#2

Adam S. wrote:

On 3/2/06, renaud delbru 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.

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


#3

Thank you adam for your answers,

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

Bye.


Renaud Delbru


#4

On 3/2/06, renaud delbru 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.

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

require ‘main’
with
class A; end

-Adam


#5

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.