Re: wie expandiere ich hashvalues in einem string

robert kuzelj <[email protected]> Thu, 24 Feb 2005 19:40:26 +0100
Newsgroups gmane.comp.lang.ruby.german
Message-ID <[email protected]>
hi pit,

 > eingebaut ist nur die normale String-Interpolation "...#{wert}...",=20
die du ja kennst. Wenn du in deinem Template nicht die Ausdr=C3=BCcke "ei=
ns",=20
"zwei" etc. verwenden w=C3=BCrdest, sondern z.B. "myhash['eins']",=20
"myhash['zwei']", dann k=C3=B6nntest du das Template mit=20
eval(%Q{"#{template}"}) expandieren. Oder, vielleicht einfacher zu=20
lesen: eval('"' + template + '"').
 >
 >   h =3D {"eins" =3D> 111, "zwei" =3D> 222}
 >   t =3D 'Eins: #{h["eins"]}, Zwei: #{h["zwei"]}'
 >
 >   s =3D eval(%Q{"#{t}"})
 >   puts s  # =3D> Eins: 111, Zwei: 222

och noe, das gefaellt mir nicht ;-)

das ist schon wesentlich besser. hab aber ein paar fragen.
010 def expand(template, values)
020    b =3D binding
030    v =3D nil
040    values.each do |name, value|
050      v =3D value
060      eval("#{name} =3D v", b)
070    end
080    eval(%Q{"#{template}"})
090 end
100
110 s =3D expand('Eins: #{eins}, Zwei: #{zwei}', {"eins" =3D> 111, "zwei"=
 =3D>
  222})
120   puts s  # =3D> Eins: 111, Zwei: 222

soweit ich aus der doku verstanden habe holt sich Kernel::binding
die variablen bindings zum zeitpunkt des aufrufs um es zb. spaeter
in einem aufruf von eval nutzen zu koennen. nun ist aber zb. v,
welches du in eval nutzt noch gar nicht definiert. warum gibt das
keinen fehler?
und schliesslich was um gottes willen macht %Q ?

danke

robertj