From: Joel VanderWerf Date: 2005-12-19T06:27:40+09:00 Subject: Re: Newbie: require 'filename' - undefined local variable or method... Grehom wrote: > I have one line of code in a file called 'stuff.rb': > myhash = { "a" => "ay", "b" => "bee", "c" => "sea" } > > and I wish to include it in another program called 'mainprog.rb' thus: > > require 'stuff' > > puts " a = " + myhash["a"] > > when I run it I get an error message: > mainprog.rb:4: undefined local variable or method `myhash' for > main:Object (NameError) Local vars are scoped to the file they are defined in, when you use require or load. You could make it global, but unless this is just a quick hack, it's not a good solution. Another option is to read and eval the file. If the myhash variable has been assigned *before* you eval, then the assignment in stuff.rb will propagate to the mainprog.rb. Like so: myhash = nil eval File.read("stuff.rb") p myhash This is ok for some purposes, but you have to know in advance which variables the file is going to define. Also, you may have scope collisions: any other local var in mainprog.rb can be affected by assignments in stuff.rb. My preference is to read the file as a string and use module_eval: # mainprog.rb m = Module.new m.module_eval(File.read("stuff.rb"), File.expand_path("stuff.rb")) p m::Myhash # stuff.rb Myhash = { "a" => "ay", "b" => "bee", "c" => "sea" } Local vars stay local. Constants are accessible in the scope of the newly defined module m. The second arg to module_eval means that errors are reported with the correct file name. This is the approach used by my "script" lib on raa. It adds some sugar and features. -- vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407