On Dec 7, 7:47 am, Vasyl Smirnov <vasyl.smir... / gmail.com> wrote:
> 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.

Not so much like a C macro, but more like a C struct...you could...use
a Struct ;)

V = Struct.new(:x, :y).new(nil, nil)

def bar
  V.x = 10
  V.y = 20
end
def foo
  bar
  puts V.x, V.y
end

Regards,
Jordan