Equivalent of "source" in ruby?

Contrary to my expectations, if I have some variable assignments in an
external file, I can’t simply call:

load rcfile

to have it sourced. Instead, I found myself having to do this:

IO.foreach(rcfile) do |line|

eval line
end

which seems lame. Is there a better way?

On 7 Sep 2007, at 14:17, Todd A. Jacobs wrote:

which seems lame. Is there a better way?

Would globals work for you?

[alexg@powerbook]/Users/alexg/Desktop(28): cat load_me.rb
$global=10
local=20
[alexg@powerbook]/Users/alexg/Desktop(29): cat main.rb
load ‘load_me.rb’

puts $global
puts local
[alexg@powerbook]/Users/alexg/Desktop(30): ruby main.rb
10
main.rb:4: undefined local variable or method `local’ for main:Object
(NameError)

Alex G.

Bioinformatics Center
Kyoto University

On Fri, 2007-07-09 at 14:17 +0900, Todd A. Jacobs wrote:

which seems lame. Is there a better way?

#test1.rb:

    @a = 5
    @b = 4

    require 'test2'

    p @a
    p @b
    p @c

#----8<-----

#test2.rb:

    @b = 3
    @c = 2

$ ruby test1.rb
5
3
2
$

Or am I missing something?

2007/9/7, Michael T. Richter [email protected]:

eval line
require ‘test2’

$ ruby test1.rb
5
3
2
$

Or am I missing something?

Yes, you are missing the local variable bit. :slight_smile:

robert

Contrary to my expectations, if I have some variable
assignments in an external file, I can’t simply call:

load rcfile

Load starts a new scope without reusing the local scope. Eval
starts a new scope with reusing the local scope. So, use eval
instead. But you should “define” the vars before loading them.

gegroet,
Erik V. - http://www.erikveen.dds.nl/


$ cat test.rb
a=nil
b=nil

eval(File.read(“vars.rb”))

Or better: Thread.new{$SAFE=4 ; eval(File.read(“vars.rb”),

Module.new.instance_eval{binding})}.join

p a
p b


$ cat vars.rb
a = 7
b = 8


$ ruby test.rb
7
8

a = nil
b = nil

Thread.new do
data = File.read(“vars.rb”)
$SAFE = 4
b = Module.new.instance_eval{binding}

eval(data, b)
end.join

p a
p b

2007/9/7, Todd A. Jacobs [email protected]:

which seems lame. Is there a better way?

It is also unsafe - not only because of the eval but also because this
will give errors for expressions that span multiple lines. The easy
fix would be

eval(File.read(rc_file))

But I’d rather resort to one of the other suggestions (namely using
local variables).

Kind regards

robert

On Sep 7, 2007, at 03:55, Erik V. wrote:

p a
p b

echo “Thread.critical = true; sleep” >> vars.rb

2007/9/7, Robert K. [email protected]:

end

local variables).
That was intended to read “global” of course. Sorry for the noise.

robert