question about idiom for loading files in initializer.rb

Hi --

This started as a question in ruby-talk. It's about this line of code:

eval(IO.read(init_path), binding, init_path)

This idiom appears in initializer.rb, in v1.2.3, for loading
environment files and plugin init files. (On Edge, the plugin stuff is
moved to another file, but the same idiom's still used in that file,
and you'll see it used for the env files in initializer.rb on Edge as
well.)

The question was, why use this idiom instead of load or require?

My assumption is that the answer is this idiom gives you flexible
bindings, but if anyone could verify that, or correct me, I'd totally
appreciate it. I don't actually see the binding passed being declared
anywhere, so it kind of puzzles me.

Thanks,
Giles

Giles,

You're on the right track with the binding. Evaling against the
current binding gives (int this case) your environment file access to
the "config" local. Check Kernel#binding in the Ruby core docs for a
bit more enlightenment.

~ j.

I think it's so some local variables are available in the init.rb
file: directory, lib_path, etc. Actually, they're now methods of the
Rails::Plugin class.

That was exactly the case. Try to share local variables between files using load and require to understand why.

The question was, why use this idiom instead of load or require?

So that the code gets access to config.*, using require would be a
different scope.

I think it's so some local variables are available in the init.rb
file: directory, lib_path, etc. Actually, they're now methods of the
Rails::Plugin class.

This suggests that you could refactor it, but you can't actually
remove it completely, because it's also used in the code which brings
in environment files.

The code is kinda repetitive:

eval(IO.read(init_path), binding, init_path) # plugins
eval(IO.read(configuration.environment_path), binding,
configuration.environment_path) # env files

So I made a tiny refactoring patch:

http://dev.rubyonrails.org/ticket/9128

Gracias senores,
Giles