From: Gordon Hartley Date: 2005-03-21T07:04:51+09:00 Subject: Dynamically requiring files - scoping issues Hi, Given the source and output below, it should be fairly obvious what I'm trying to do (doing code generation / automation stuff.) Page 124 of Pickaxe (2nd Ed.) mentions that variables are not propogated to the scope that loads/requires them, so is there any way of referring to / accessing them? I've resolved it as per main2.rb excerpt below, but was wondering whether there is a 'cleaner' (free or minimal eval()) solution? Contrived example below, which results in: Got to here in one.rb Got to here in two.rb undefined local variable or method `one' for main:Object (NameError) Thanks, Gordon ### dynamic/one.rb ### one = Needed.new("1") puts "Got to here in one.rb" ### dynamic/two.rb ### two = Needed.new("2") puts "Got to here in two.rb" ### needed/needed.rb ### class Needed attr_accessor :test def initialize(test) @test = test end end class DoStuff def DoStuff.go(needed_array) needed_array.each do |needed| # do stuff with needed..... end end end ### main.rb ### require 'needed/needed' container = [] Dir["dynamic/*.rb"].each do |file_name| require "#{file_name[0..-4]}" end Dir.chdir("./dynamic") Dir["*.rb"].each do |file_name| eval("container << #{file_name[0..-4]}") end DoStuff.go(container) ### main2.rb excerpt, not part of example ### Dir["*.rb"].each do |file_name| eval_me = File.open(file_name).readlines.to_s eval(eval_me) eval("container << " + file_name[0..-4].to_s) end