Kann ich dynamisch eine Ruby-Methode definieren, die einen Block akzeptiert?

8

Ich weiß, dass ich Methoden für eine Klasse dynamisch definieren kann, indem ich define_method verwende, und dass ich die Parameter festlege, die diese Methode unter Verwendung der Arität des Blocks verwendet.

Ich möchte eine Methode dynamisch definieren, die sowohl optionale Parameter als auch einen Block akzeptiert. In Ruby 1.9 ist dies einfach, da das Übergeben eines Blocks an einen Block jetzt erlaubt ist.

Leider erlaubt Ruby 1.8 dies nicht, daher wird folgendes nicht funktionieren:

%Vor%

Das Ersetzen des expliziten block.call durch yield behebt das Problem ebenfalls nicht.
Ein Upgrade auf Ruby 1.9 ist für mich leider keine Option. Ist das ein hartnäckiges Problem, oder gibt es einen Weg darum?

    
andrewdotnich 27.09.2011, 00:20
quelle

2 Antworten

6

Dies funktioniert mit Ruby 1.8.7, aber nicht 1.8.6:

%Vor%

Testen mit:

%Vor%

gibt:

%Vor%

(mit 1.8.6 gibt es syntax error, unexpected tAMPER, expecting '|' .)

Wenn Sie sowohl optionale Argumente als auch Blockieren möchten, können Sie Folgendes versuchen:

%Vor%

testet mit:

%Vor%

gibt:

%Vor%     
matt 27.09.2011, 00:40
quelle
4

Sie können class_eval mit einer Zeichenfolge anstelle von define_method verwenden. Der Nachteil dabei ist (abgesehen davon, dass man nicht so elegant ist), dass man lexikalisches Scoping verliert. Aber das wird oft nicht benötigt.

    
Daniel Brockman 27.09.2011 00:25
quelle