# String interpolation

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

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

On Sun, 26 Aug 2007 18:38:46 +0900, Stefan R. 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

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

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

Thomas W. wrote:

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@:7(irb)

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.