# Equivalent of "source" in ruby?

**URL:** <https://www.ruby-forum.com/t/equivalent-of-source-in-ruby/114027>\
**Category:** Ruby\
**Created:** [September 7, 2007, 7:17am UTC](https://www.ruby-forum.com/t/equivalent-of-source-in-ruby/114027 "2007-09-07T07:17:57Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Todd\_ASJacobs](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/f17d59/32.png) [@Todd\_ASJacobs](https://www.ruby-forum.com/u/Todd_ASJacobs)\
**Post date:** [September 7, 2007, 7:17am UTC](https://www.ruby-forum.com/t/equivalent-of-source-in-ruby/114027/1 "2007-09-07T07:17:57Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![Todd\_ASJacobs](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/f17d59/32.png) [@Todd\_ASJacobs](https://www.ruby-forum.com/u/Todd_ASJacobs)\
**Post date:** [September 7, 2007, 7:28am UTC](https://www.ruby-forum.com/t/equivalent-of-source-in-ruby/114027/2 "2007-09-07T07:28:58Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Todd\_ASJacobs](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/f17d59/32.png) [@Todd\_ASJacobs](https://www.ruby-forum.com/u/Todd_ASJacobs)\
**Post date:** [September 7, 2007, 7:39am UTC](https://www.ruby-forum.com/t/equivalent-of-source-in-ruby/114027/3 "2007-09-07T07:39:58Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![Todd\_ASJacobs](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/f17d59/32.png) [@Todd\_ASJacobs](https://www.ruby-forum.com/u/Todd_ASJacobs)\
**Post date:** [September 7, 2007, 12:53pm UTC](https://www.ruby-forum.com/t/equivalent-of-source-in-ruby/114027/4 "2007-09-07T12:53:42Z")

</div>

2007/9/7, Michael T. Richter [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> eval line  
> require ‘test2’
> 
> $ ruby test1.rb  
> 5  
> 3  
> 2  
> $
> 
> Or am I missing something?

Yes, you are missing the local variable bit. 🙂

robert

---

<div class="post-metadata">

**Author:** ![Todd\_ASJacobs](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/f17d59/32.png) [@Todd\_ASJacobs](https://www.ruby-forum.com/u/Todd_ASJacobs)\
**Post date:** [September 7, 2007, 12:51pm UTC](https://www.ruby-forum.com/t/equivalent-of-source-in-ruby/114027/5 "2007-09-07T12:51:42Z")

</div>

> 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/](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

---

<div class="post-metadata">

**Author:** ![Todd\_ASJacobs](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/f17d59/32.png) [@Todd\_ASJacobs](https://www.ruby-forum.com/u/Todd_ASJacobs)\
**Post date:** [September 7, 2007, 12:56pm UTC](https://www.ruby-forum.com/t/equivalent-of-source-in-ruby/114027/6 "2007-09-07T12:56:43Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Todd\_ASJacobs](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/f17d59/32.png) [@Todd\_ASJacobs](https://www.ruby-forum.com/u/Todd_ASJacobs)\
**Post date:** [September 7, 2007, 12:55pm UTC](https://www.ruby-forum.com/t/equivalent-of-source-in-ruby/114027/7 "2007-09-07T12:55:43Z")

</div>

2007/9/7, Todd A. Jacobs [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> 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

---

<div class="post-metadata">

**Author:** ![Todd\_ASJacobs](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/f17d59/32.png) [@Todd\_ASJacobs](https://www.ruby-forum.com/u/Todd_ASJacobs)\
**Post date:** [September 10, 2007, 6:23am UTC](https://www.ruby-forum.com/t/equivalent-of-source-in-ruby/114027/8 "2007-09-10T06:23:53Z")

</div>

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

> p a  
> p b

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

---

<div class="post-metadata">

**Author:** ![Todd\_ASJacobs](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/f17d59/32.png) [@Todd\_ASJacobs](https://www.ruby-forum.com/u/Todd_ASJacobs)\
**Post date:** [September 10, 2007, 9:01am UTC](https://www.ruby-forum.com/t/equivalent-of-source-in-ruby/114027/9 "2007-09-10T09:01:07Z")

</div>

2007/9/7, Robert K. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

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

robert
