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
Adam S. wrote:
On 3/2/06, renaud delbru [email protected] 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
Thank you adam for your answers,
I have resolved the problem with a toplevel file which contains
the sequence of require.
Bye.
–
Renaud Delbru
On 3/2/06, renaud delbru [email protected] 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
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.