Velocity Reviews > Ruby > String interpolation

# String interpolation

Thomas Worm
Guest
Posts: n/a

 08-26-2007
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

Stefan Rusterholz
Guest
Posts: n/a

 08-26-2007
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-forum.com/.

Thomas Worm
Guest
Posts: n/a

 08-26-2007
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
Guest
Posts: n/a

 08-26-2007
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
Guest
Posts: n/a

 08-26-2007
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/9780596510657/
"Test Driven Ajax (on Rails)"
assert_xpath, assert_javascript, & assert_ajax