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

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

···

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

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

a = 6
puts b

Returns:
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 Worm wrote:

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

a = 6
puts b

Returns:
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
  Test Driven Ajax (on Rails) [Book]
  "Test Driven Ajax (on Rails)"
  assert_xpath, assert_javascript, & assert_ajax

Many thanks for the quick help !!!
Thomas

···

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