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