On Thu, 4 Sep 2008 10:30:51 +0200
"Gregor Schmidt" <[EMAIL PROTECTED]> wrote:

> Hallo,
> 
> Mal die Frage, was du damit machen willst beiseite gelassen: Das ganze
> geht auch recht elegant ohne eval(String).

hallo gregor,
das hoffte ich. dein lösungsansatz sieht trez chic aus.

und damit sich michael nicht länger fragt wozu das gut sein soll:
ich spiele gerade mit einer verteilten answendung, in der es ein 
rails-basiertes frontend geben soll, welches mittels json-rpc eine middleware 
kontaktet. von dort wird logik, bzw. funktion exportiert, die ich in meine 
unbedarften model-classes injektiere.
der ansatz dabei ist die zusätzlichen (remote) funktionen beim hochfahren der 
anwendung bereitzustellen.
vorhandene ruby-basierte json-rpc client-implementierungen gehen den m.e. 
uneleganten weg, jeden methodenaufruf durch 'method-missing' zu schleusen, um 
dort dann einen rpc-aufruf abzusetzen, der nach rfc im negativen falle ein 404 
generiert, bzw. zu generieren hat...
und: natürlich gibt es auch die möglichkeit, die schnittstelle im frontend fest 
zu verdrahten, bzw. die (remote)funktionen im model auszuformulieren, das macht 
das ganze lesbarer - aber es ist weniger lustig.

viele grüsse
rene


> Ich versuche mal das gleiche Ergebnis zu erzielen, nur eben so, wie
> ich es geschrieben hätte.
> 
>   class Foobar
>   end
>   my_mod = Object.const_set(:Foo, Module.new)
> 
>   if defined?(Foo) # returns 'constant'
>     my_mod.module_eval do
>       define_method :bar do
>         puts "static function 'bar' called"
>       end
>     end
> 
>     Foobar.extend(my_mod)
>   end

> > wie aber parametrisiere ich die zu definierende funktion?
> > also im sinne von :define_method, 'bar(*args)' ...
> 
> Die Antwort ist verhältnismäßig einfach: Gibt dem Block, den du an
> define_method übergibst einfach Parameter, also z.B.
> 
>     my_mod.module_eval do
>       define_method :bar do |*args|
>         puts "static function 'bar' called with '#{args.join(', ')}'"
>       end
>     end
> 
> > comments?
> 
> Das eval von Strings hat immer einen faden Beigeschmack, das sich zu
> leicht Userinput in diesen Strings wiederfindet. Das kann leicht
> eskalieren. Außerdem funktionieren Code-Analyse und
> Syntax-Highlighting in solchen Blöcken nicht.
> 
> Es gibt aber auch Fälle in denen man nicht drumherum kommt. In 1.8
> z.B. können Blöcke keine anderen Blöcke als Parameter annehmen. Damit
> könnte man also keine dynamischen Methoden definieren, die Blöcke
> erwarten. Hier kommt man um eval(String) oder module_eval(String)
> nicht herum.
> 
> Auch die Ausführungszeit von den String-eval-definierten Methoden kann
> kürzer sein, als die der dynamisch definierten, da sie keinen Scope
> mehr mit sich rumschleppen müssen.
> 
> Aber das ist ein weites Feld.
> 
> Viele Grüße
> 
> Gregor
> _______________________________________________
> rubyonrails-ug mailing list
> [email protected]
> http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug
_______________________________________________
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/mailman/listinfo/rubyonrails-ug

Antwort per Email an