Sy Ali wrote:
> On 9/10/06, Mike Stok <mike / stok.ca> wrote:
> > > Previously, I've been duplicating methods and just renaming a single
> > > variable.. (just to ensure that method1 works the same as method2) a
> > > variation of this would be cleaner I think.
> > >
> > > My code is still quite hackish, so it's likely that I'll figure things
> > > out in some time, and will be able to evolve towards even cleaner
> > > code, perhaps dropping this trick.
> >
> > What are you actually trying to do?  Sometimes stepping back from a
> > particular obstacle can give a fresh point of view which sometimes
> > leads to "nicer" code.
> >
> > Mention of duplicating methods and renaming a single variable hints
> > strongly there may be more ways to skin this cat.
>
> I was just looking for an alternative to the classic if/then/else.
>
> My original method would do this:
>
> def test1
>   puts "#{@something_something}"
> end
>
> def test2
>   puts "#{@something_something_else}"
> end
>
> or maybe I could have done this:
>
> def test(string)
>   if string == "something" then
>     puts "#{@something_something}"
>   elsif string == "something_else" then
>     puts "#{@something_something_else}"
>   end
> end
>
> What if I wanted to expand this a thousand-fold?  I'd have to do this:
>
> def test(string)
>   case string
>     when "something" : puts "#{@something_something}"
>     when "something_else" : puts "#{@something_something_else}"
>     # ... repeated many more times
>   end
> end
>
> But that thousand-line case could be replaced with a one-liner:
>
> def test(string)
>   puts "#{instance_variable_get("@#{string + "_something"}")}"
> end
>
>
> I got here because I was looking at my inelegant code and wanted to
> know how it could be simplified when faced with greater use.
>
> Thinking in infinites.. yes, it's optimising early, but I wanted to
> learn something new.

Uh...if you have so many similarly named variables, it sounds like you
should be using an array or a map.

The map could be set up with the keys (a certain string) indexing to
the values of your old variables.

@some_map['var'] = "pass"

def test(string)
  puts @some_map[string]
end 

test('var')  #=>  "pass"