[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

patching strings together to make a variable

Sy Ali

9/10/2006 1:51:00 PM

I'm curious to know if I can patch multiple things together to make a variable.

I have some imaginary code snippets. The most direct way I can think
of is something like this:

$a = true
$var = "fail"
$variable = "pass"

puts "#{$var(if $a == true then "iable" end)}"

since $a == true, I would like this to become:
puts "#{$variable}"

But this doesn't work. I didn't expect it to, but is something like
this possible? Am I stuck with this? :

puts "#{if $a == true then $variable else $var end}"


What I'd really like to learn is how I can patch multiple strings
together and call it a variable. I think I'm just missing some simple
piece of this puzzle..

The imaginary code would be:

ab = "pass"
puts ("a" + "b").to_variable

Or to a global, an instance variable, etc.. envisioned like this:

puts $("a" + "b")
puts @("a" + "b")


If there's a simple way to do this, a code snippet or a pointer to a
manual reference would be all I need.

18 Answers

dblack

9/10/2006 2:20:00 PM

0

David Vallner

9/10/2006 3:42:00 PM

0

Sy Ali wrote:
> What I'd really like to learn is how I can patch multiple strings
> together and call it a variable. I think I'm just missing some simple
> piece of this puzzle..
>
> The imaginary code would be:
>
> ab = "pass"
> puts ("a" + "b").to_variable
>
>

This sounds very, very PHP to me. And subjectively speaking, I think
variable variables from that language are the worst abomination in a
structured programming language since VB goto.

Does that really make code clearer instead of just "clever"?

David Vallner

Sy Ali

9/10/2006 3:53:00 PM

0

On 9/10/06, David Vallner <david@vallner.net> wrote:
> > ab = "pass"
> > puts ("a" + "b").to_variable
>
> This sounds very, very PHP to me. And subjectively speaking, I think
> variable variables from that language are the worst abomination in a
> structured programming language since VB goto.
>
> Does that really make code clearer instead of just "clever"?

I know nothing of PHP, but this trick would make my code much clearer.
With David.first's recommendation of instance_variable_get I can
re-use blocks of code much more intelligently.

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.


Thanks for the help Davids.. =)

Mike Stok

9/10/2006 4:51:00 PM

0


On 10-Sep-06, at 11:52 AM, Sy Ali wrote:

> On 9/10/06, David Vallner <david@vallner.net> wrote:
>> > ab = "pass"
>> > puts ("a" + "b").to_variable
>>
>> This sounds very, very PHP to me. And subjectively speaking, I think
>> variable variables from that language are the worst abomination in a
>> structured programming language since VB goto.
>>
>> Does that really make code clearer instead of just "clever"?
>
> I know nothing of PHP, but this trick would make my code much clearer.
> With David.first's recommendation of instance_variable_get I can
> re-use blocks of code much more intelligently.
>
> 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.

Mike

--

Mike Stok <mike@stok.ca>
http://www.stok...

The "`Stok' disclaimers" apply.





Mike Dvorkin

9/10/2006 5:46:00 PM

0

How about:

puts "#{eval('$' + 'var' + (if $a == true then "iable" end))}"
# => pass

Mike Dvorkin
http://www.rubyw...



On Sep 10, 2006, at 6:50 AM, Sy Ali wrote:

> $a = true
> $var = "fail"
> $variable = "pass"
>
> puts "#{$var(if $a == true then "iable" end)}"
>
> since $a == true, I would like this to become:
> puts "#{$variable}"


dblack

9/10/2006 5:52:00 PM

0

Sy Ali

9/10/2006 5:58:00 PM

0

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.

Axis Sivitz

9/10/2006 6:22:00 PM

0

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"

dblack

9/10/2006 6:31:00 PM

0

Mike Stok

9/10/2006 6:45:00 PM

0


On 10-Sep-06, at 2:31 PM, dblack@wobblini.net wrote:

> Hi --
>
> On Mon, 11 Sep 2006, Axis Sivitz wrote:
>
>> 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"
>
> Which brings us back to:
>
>> http://ww... :-) Perl has these "soft" or "symbolic"
>> references, plus a whole chorus of people to tell you that you
>> should use hashes instead :-)
>
> :-)

One of the reasons for the Perl chorus is that in Perl the "soft
references" can only point to non-lexical variables, and this can
cause much opportunity for enlightenment later!

#!/usr/bin/env perl

# use strict;
# use warnings;

$foo = 'foo1';
my $foo = 'foo2';

$soft_ref = 'foo';
$real_ref = \$foo;

print "soft says $$soft_ref\n";
print "real says $$real_ref\n";

__END__

produces:

soft says foo1
real says foo2

... which is one of the reasons the strict and warnings pragmata are
considered useful.

Mike

--

Mike Stok <mike@stok.ca>
http://www.stok...

The "`Stok' disclaimers" apply.