Asfand Yar Qazi wrote:
> Hi,
> 
> I'd like to evaluate a string of Ruby code (stored in a YAML file, as it 
> happens) safely.  Note the purpose is simply to avoid variable name 
> clashes and stop lots of eval'ed Ruby code from overloading the heap 
> with lots of objects (i.e. when the anonymous module is deleted, the 
> temporary variables defined within it are also gone.)
> 
> The purpose is NOT for safety reasons, so we don't have to worry about 
> that.
> 
> Am I doing it the right way?  Or does anybody know a better way?  Any 
> better way of passing in arguments to the code in the string?

Actually, I forgot to mention the other main very important reason for 
doing it this way: passing arguments to the eval'ed code.  Also, I may 
  need to be able to eval several strings at once (kind of) so storing 
the arguments in global variables is also a no-no.

> 
> Anyway, here goes:
> 
> def eval_string(s, *args_to_pass)
>     m = Module.new
>     m.const_set("ARGS", arg_to_pass)
>     m.class_eval(s.to_str)
> end # Soon m will be GC'ed, and all temp objects gone! MUHAHA
> 
> s.eval_string(<<EOL, [1, 2, 3, 4, 5])
> a = ARGS
> b = a.collect {|i| i*3}
> c = b.join("||")
> puts(c)
> EOL
> 
> 
> 
> Thanks,
>     Asfand Yar