Contents of variable as variable name


#1

I know that sounds a bit crazy, but is there a way to do that?


#2

On 7/15/07, Rob K. removed_email_address@domain.invalid wrote:

I know that sounds a bit crazy, but is there a way to do that?

One way of doing it is:

irb(main):025:0> a = “foo”
“foo”
irb(main):026:0> eval “#{a}=1”
1
irb(main):027:0> foo
1

Although eval is normally discouraged and must be used sparingly.


#3

Rob K. said the following on 07/14/2007 11:10 PM:

I know that sounds a bit crazy, but is there a way to do that?

oh oh oh … I asked this question and did a bit of experimentation a
while back.

I found a blank spot in my wiki where I was supposed to have written it
all down, but I guess I didn’t get around to it. I just found and
dumped some notes in just now… maybe something there will help inspire
you:

http://jrandomhacker.info/Ruby_code_snippets/patching_strings_together_to_make_a_variable

if eval isn’t appropriate, then this snippet might work:

@ab = “pass”
puts instance_variable_get("@#{“a” + “b”}")


#4

On 7/15/07, Gregory S. removed_email_address@domain.invalid wrote:

On Sun, Jul 15, 2007 at 12:10:52PM +0900, Rob K. wrote:

I know that sounds a bit crazy, but is there a way to do that?

Don’t do it. If you think you need to, it is indicative of bad design.
There are significant dangers involved. The following is about Perl rather
than Ruby, but the concept is the same:

http://perl.plover.com/varvarname.html
http://perl.plover.com/varvarname2.html
http://perl.plover.com/varvarname3.html

Thanks for the reading. This helped me avoid learning a Bad habit.

This comment from the second document summed it up for me:
The real problem is that if your string contains something
unexpected, it will sabotage a totally unrelated part of the program,
and then you will have one hell of a time figuring out the bug.

Now the next time I itch to do something like this I’ll explore using
a hash instead.


#5

On Sun, Jul 15, 2007 at 12:10:52PM +0900, Rob K. wrote:

I know that sounds a bit crazy, but is there a way to do that?

Don’t do it. If you think you need to, it is indicative of bad design.
There are significant dangers involved. The following is about Perl
rather
than Ruby, but the concept is the same:

http://perl.plover.com/varvarname.html
http://perl.plover.com/varvarname2.html
http://perl.plover.com/varvarname3.html

–Greg