[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

String interpolation

Thomas Worm

8/26/2007 9:18:00 AM

a = 5
b = "#{a}"
puts b

a = 6
puts b

Returns:
5
5

which is clear to me, why. But is there a way to define such a string and
interpolate it at a later time?

Thomas

4 Answers

Stefan Rusterholz

8/26/2007 9:39:00 AM

0

Thomas Worm wrote:
> a = 5
> b = "#{a}"
> puts b
>
> a = 6
> puts b
>
> Returns:
> 5
> 5
>
> which is clear to me, why. But is there a way to define such a string
> and
> interpolate it at a later time?
>
> Thomas

a = 5
b = proc { "a is now: #{a}" }
def b.to_s; call; end
puts b # !> a is now: 5
a = 6
puts b # !> a is now: 6

Enjoy

Regards
Stefan
--
Posted via http://www.ruby-....

Thomas Worm

8/26/2007 9:45:00 AM

0

On Sun, 26 Aug 2007 18:38:46 +0900, Stefan Rusterholz wrote:

> a = 5
> b = proc { "a is now: #{a}" }
> def b.to_s; call; end
> puts b # !> a is now: 5
> a = 6
> puts b # !> a is now: 6

Many thanks for the quick help !!!
Thomas

Xavier Noria

8/26/2007 9:48:00 AM

0

On Aug 26, 2007, at 11:20 AM, Thomas Worm wrote:

> a = 5
> b = "#{a}"
> puts b
>
> a = 6
> puts b
>
> Returns:
> 5
> 5
>
> which is clear to me, why. But is there a way to define such a
> string and
> interpolate it at a later time?

You normally use a templating system, for example:

require 'erb'

b = ERB.new("a is <%= a %>")

a = 5
puts b.result(binding) # -> a is 5

a = 6
puts b.result(binding) # -> a is 6

-- fxn


Phlip

8/26/2007 3:13:00 PM

0

Thomas Worm wrote:

>a = 5
> b = "#{a}"
> puts b
>
> a = 6
> puts b
>
> Returns:
> 5
> 5
>
> which is clear to me, why. But is there a way to define such a string and
> interpolate it at a later time?

You are asking how to do a "block closure". Study that, because it's a major
Ruby topic and a very good design technique. I have not yet found a way to
over-use or abuse blocks in Ruby!

A 'lambda' is one of the block systems that can bond with the variables
around it. So stick your string evaluator into a lambda, and call it:

>> a = 5
=> 5
>> q = lambda{"#{a}"}
=> #<Proc:0xb721d4d4@(irb):7>
>> q.call
=> "5"
>> a = 6
=> 6
>> q.call
=> "6"

Block closures are a very good design technique because a has a very limited
scope over a very long lifespan. We could have stored that q and used it
later. So a becomes very encapsulated.

--
Phlip
http://www.oreilly.com/catalog/9780...
"Test Driven Ajax (on Rails)"
assert_xpath, assert_javascript, & assert_ajax