Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Ruby (http://www.velocityreviews.com/forums/f66-ruby.html)
-   -   String interpolation (http://www.velocityreviews.com/forums/t843577-string-interpolation.html)

 Thomas Worm 08-26-2007 09:17 AM

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

 Stefan Rusterholz 08-26-2007 09:38 AM

Re: String interpolation

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 08-26-2007 09:44 AM

Re: String interpolation

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 08-26-2007 09:48 AM

Re: String interpolation

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 08-26-2007 03:13 PM

Re: String interpolation

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

 All times are GMT. The time now is 03:11 AM.