Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > patching strings together to make a variable

Reply
Thread Tools

patching strings together to make a variable

 
 
Sy Ali
Guest
Posts: n/a
 
      09-10-2006
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.

 
Reply With Quote
 
 
 
 
dblack@wobblini.net
Guest
Posts: n/a
 
      09-10-2006
Hi --

On Sun, 10 Sep 2006, Sy Ali wrote:

> 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.


http://www.perl.org Perl has these "soft" or "symbolic"
references, plus a whole chorus of people to tell you that you should
use hashes instead

Ruby gives you ways to examine available existing variables, and you
can pry into them:

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

and so on.


David

--
David A. Black | http://www.velocityreviews.com/forums/(E-Mail Removed)
Author of "Ruby for Rails" [1] | Ruby/Rails training & consultancy [3]
DABlog (DAB's Weblog) [2] | Co-director, Ruby Central, Inc. [4]
[1] http://www.manning.com/black | [3] http://www.rubypowerandlight.com
[2] http://dablog.rubypal.com | [4] http://www.rubycentral.org

 
Reply With Quote
 
 
 
 
David Vallner
Guest
Posts: n/a
 
      09-10-2006
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

 
Reply With Quote
 
Sy Ali
Guest
Posts: n/a
 
      09-10-2006
On 9/10/06, David Vallner <(E-Mail Removed)> 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.. =)

 
Reply With Quote
 
Mike Stok
Guest
Posts: n/a
 
      09-10-2006

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

> On 9/10/06, David Vallner <(E-Mail Removed)> 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 <(E-Mail Removed)>
http://www.stok.ca/~mike/

The "`Stok' disclaimers" apply.





 
Reply With Quote
 
Mike Dvorkin
Guest
Posts: n/a
 
      09-10-2006
How about:

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

Mike Dvorkin
http://www.rubywizards.com



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}"



 
Reply With Quote
 
dblack@wobblini.net
Guest
Posts: n/a
 
      09-10-2006
Hi --

On Mon, 11 Sep 2006, Mike Dvorkin wrote:

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


If your if fails you end up adding nil to a string, which will give
you an error.

So.....

puts eval('$' + 'var' + ($a ? "iable" : ""))

or something.


David

> Mike Dvorkin
> http://www.rubywizards.com
>
>
>
> 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}"

>
>


--
David A. Black | (E-Mail Removed)
Author of "Ruby for Rails" [1] | Ruby/Rails training & consultancy [3]
DABlog (DAB's Weblog) [2] | Co-director, Ruby Central, Inc. [4]
[1] http://www.manning.com/black | [3] http://www.rubypowerandlight.com
[2] http://dablog.rubypal.com | [4] http://www.rubycentral.org

 
Reply With Quote
 
Sy Ali
Guest
Posts: n/a
 
      09-10-2006
On 9/10/06, Mike Stok <(E-Mail Removed)> 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.

 
Reply With Quote
 
Axis Sivitz
Guest
Posts: n/a
 
      09-10-2006
Sy Ali wrote:
> On 9/10/06, Mike Stok <(E-Mail Removed)> 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"

 
Reply With Quote
 
dblack@wobblini.net
Guest
Posts: n/a
 
      09-10-2006
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://www.perl.org Perl has these "soft" or "symbolic"
> references, plus a whole chorus of people to tell you that you
> should use hashes instead





David

--
David A. Black | (E-Mail Removed)
Author of "Ruby for Rails" [1] | Ruby/Rails training & consultancy [3]
DABlog (DAB's Weblog) [2] | Co-director, Ruby Central, Inc. [4]
[1] http://www.manning.com/black | [3] http://www.rubypowerandlight.com
[2] http://dablog.rubypal.com | [4] http://www.rubycentral.org

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Attaching two strings together Joah Senegal C++ 10 09-26-2006 05:03 PM
Strings, Strings and Damned Strings Ben C Programming 14 06-24-2006 05:09 AM
newby question joining variables and strings together chris Javascript 5 10-16-2005 05:25 PM
Patching map sections Together darkrats Computer Support 5 05-12-2005 01:50 AM
Help! aspnet_wp not working after patching kb886903/kb886906! Edward Yang ASP .Net 6 02-18-2005 08:18 PM



Advertisments