On Dec 7, 3:28 pm, "Robert Klemme" <shortcut... / googlemail.com> wrote:
> 2007/12/7, Vasyl Smirnov <vasyl.smir... / gmail.com>:
>
> > I wonder if there is any way to create local variables dynamically,
> > for example, given
>
> > def foo
> >   bar
> >   puts x, y
> > end
>
> > is it possible for bar to somehow create and initialize x and y?
> > Binding doesn't seem to be modifiable..
>
> You cannot do this easily because of the method / variable ambiguity.
> There's a hack to do it: you need to define them before you use them
> but it is ugly and does not work properly.
>
> 14:23:17 ~
> $ ruby <<XXX> def foo
> > x=y=nil
> > bar(binding)
> > puts x,y
> > end
> > def bar(b)
> > eval("x=1;y=2",b)
> > end
> > foo
> > XXX
>
> 1
> 2
>
> The problem with dynamically introducing local variables is that your
> code needs to be statically aware of them in order to use them.  Even
> though you can inject any number of additional local variables into a
> binding, they won't get used because they do not appear in the code of
> that method.
>

Thanks for clarifying that.


> A much better solution to the problem of storing dynamic values is a Hash.
>
> def foo
>   data = {}
>   bar data
>   puts data[:x], data[:y]
> end
>
> def bar(x)
>   x[:x] = 1
>   x[:y] = 2
> end
>
> But you can as well return multiple values
>
> def foo
>   x,y = bar
>   puts x, y
> end
>
> def bar
>   return 1,2
> end

The hash approach is nice, and I actually use it for some other code.

I've posted this question because I wanted to eliminate the need to
write "x, y = bar" and just go with "bar".
The reason is that I have a bunch of methods, each starting with a
kind of "x, y = bar", only with longer variable names.
So it looked like it would be nice to somehow reduce them.

So, it looks like I should either a) stop whining about it, or b) use
one of the proposed approaches.