"Navindra Umanee" <navindra / cs.mcgill.ca> schrieb im Newsbeitrag
news:20050207002403.A12145 / cs.mcgill.ca...
> Hi,
>
> I'm generating an HTML header as a String that makes heavy use of
> interpolation.  Essentially I have something like:
>
> def make_html_header()
>     str <<END
> blah #{blah} blah #{blah} blah #{blah}
> END
> end
>
> This works great.  Most of the interpolations are essentially
> configuration parameters that I've elegantly stuffed into the instance
> variables of a Singleton class, some are method invocations.  These
> parameters don't change often, if at all, and the header is more or
> less identical for each HTML page that is generated.
>
> So I would like to generate the header once and stuff it in an
> instance variable.  However, there are one or two variable
> interpolations that are unique to each page e.g. the title of the
> page.
>
> How can I specify that some interpolations should be interpolated
> immediately whilst a few others should be delayed until the next time
> the String is evaluated?  I can think of some hacky ways i.e. doing
> subsequent string processing and substitions, I'm just wondering if
> there is a more elegant way.

One option is two levels of interpolation:

generator = "my gen"
application = "my test app"
header = "\"<html>.....#{generator} .... #{application} .... \#{title}\""
....
title = "foo"
real_header = eval header

Or you create a lambda for that:

def create_header(generator, application)
  eval "lambda {|title| \"<html>.....#{generator} .... #{application} ....
\#{title}\" }"
end

>> x = create_header generator, application
=> #<Proc:0x100c2990@(eval):1>
>> x.call "foo"
=> "<html>.....my gen .... my test app .... foo"

> Also, where is the "<<MARKER" syntax (nothing in ri?) and Ruby string
> interpolation officially documented, if anywhere?

http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_stdtypes.html#S2

Kind regards

    robert