Wrap external source file in a module

Hello, i have another question.

I have a strange situation which i have not resolved yet where for some
reason i have to wrap several classes in a module, otherwise the program
doesn’t work as expected (by me of course).
Can anybody please tell me the following: is it possible to read class
definition from another file and wrap them in a module?

Here is an example:

I have several classes defined in a file models.rb:

class Person
  ...
end

class Address
  ...
end

I want to load or require this file in another file, say program.rb, so
that the classes were wrapped together in a module M, like

module M
  load "models.rb"
end

p = M::Person.new

but this doesn’t work (M::Person is an uninitialized constant, according
to an error message).

Is there some way to do this?

Thank you,

Alexey.

On May 1, 1:55pm, Alexey M. [email protected]
wrote:

I have several classes defined in a file models.rb:
that the classes were wrapped together in a module M, like
Is there some way to do this?
You need to evaluate the file:

module M
module_eval File.read(File.dirname(FILE) + ‘/models.rb’)
end

p = M::Person.new

Thanks Thomas, this works!

Is this the easiest way??
Does not look too natural.

Alexey.

2011/5/1 Alexey M. [email protected]:

Thanks Thomas, this works!

Is this the easiest way??
Does not look too natural.

IMHO not natural is what you are trying to achieve :wink:

On 05/01/2011 10:55 AM, Alexey M. wrote:

I have several classes defined in a file models.rb:
that the classes were wrapped together in a module M, like

 module M
   load "models.rb"
 end

 p = M::Person.new

but this doesn’t work (M::Person is an uninitialized constant, according
to an error message).

The basic trick is module_eval. Here’s a library that does that for you
and has a few other features:

http://redshift.sourceforge.net/script

Your program.rb would be this:

require ‘script’
M = Script.load “models.rb” # M is now a module
person = M::Person.new

Thanks Joel, i’ll consider your library.

For me it was only important to make it work without modifying the
loaded file (i still do not understand why it doesn’t work when not
wrapped in a module, but this is not so important).
So module_eval works for me.
Still it is somewhat unexpected (against the Least Surprise principle)
that calling “load” inside a module does not load the source inside that
module.

Alexey.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs