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