Re: wie expandiere ich hashvalues in einem string
Christian Neukirchen <[email protected]> Thu, 24 Feb 2005 20:41:35 +0100
| Newsgroups | gmane.comp.lang.ruby.german |
|---|---|
| Message-ID | <[email protected]> |
robert kuzelj <[email protected]> writes: > hi pit, > > > eingebaut ist nur die normale String-Interpolation "...#{wert}...", > die du ja kennst. Wenn du in deinem Template nicht die Ausdr=FCcke > "eins", "zwei" etc. verwenden w=FCrdest, sondern > z.B. "myhash['eins']", "myhash['zwei']", dann k=F6nntest du das > Template mit eval(%Q{"#{template}"}) expandieren. Oder, vielleicht > einfacher zu 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, "zwe= i" =3D> > 222}) > 120 puts s # =3D> Eins: 111, Zwei: 222 Wenn man sowieso einen Hash =FCbergibt: def expand(template, values) template.gsub(/\#{(\w+)}/) { values[$1] } end Ungetestet. > 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 ? %Q{...} =3D> '...' Statt {} k=F6nnen auch andere Klammern oder (fast) beliebige Zeichen verwendet werden. > danke Bitte sehr, --=20 Christian Neukirchen <[email protected]> http://chneukirchen.org