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. 
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