Ross Bamford
2/22/2006 2:29:00 PM
On Wed, 2006-02-22 at 23:08 +0900, Ronald Fischer wrote:
> How do I evaluate a text file as a sequence of Ruby statements?
> (For those who happen to know Perl: I would like to have an
> equivalent of the Perl 'do FILENAME' feature).
>
> For example, I have a file "foo" which contains the lines
>
> abc=4
> def=5
>
> I would like to "evaluate" the file such that after this, the
> variable abc is set to 4 and def is set to 5.
>
> I tried the following:
>
> eval(File.new("foo").read)
>
> But after this, abc is still undefined. What am I doing wrong here?
It's just the way Ruby works with respect to deciding whether 'a' is a
variable or a method. Your assignment didn't get 'seen' except inside an
eval. You can use eval again to get back there (changed the var names,
def is a keyword):
eval File.read('foo.rb')
p eval('a')
# => 4
p eval('b')
# => 5
But that's a hack, and really I think you should consider an alternate
design - local variables are supposed to be, well, local. Maybe
constants or (though it pains me to say it) globals would be more
suitable?
Another technique I've used with great success is having a class that
acts as context for an external script, providing methods and holding
data in instance variables. You supply a script similar to yours above,
except using instance variables, which is then instance_eval'd in an
instance of that class, after which you have a self-contained
configuration, or whatever else it is you made.
--
Ross Bamford - rosco@roscopeco.REMOVE.co.uk