2012-07-03 12 views
5

Supponendo Ho il seguente proc:Come passare un blocco a un altro in Ruby?

a = Proc.new do 
    puts "start" 
    yield 
    puts "end" 
end 

anche assumendo passo a un altro metodo che chiama successivamente instance_eval su un'altra classe con quel blocco, come posso ora passare un blocco sull'estremità di detto metodo che ottiene ceduto in a.

Ad esempio:

def do_something(a,&b) 
    AnotherClass.instance_eval(&a) # how can I pass b to a here? 
end 

a = Proc.new do 
    puts "start" 
    yield 
    puts "end" 
end 

do_something(a) do 
    puts "this block is b!" 
end 

uscita dovrebbe naturalmente dovrebbe essere:

start 
this block is b! 
end 

Come posso passare il blocco secondario ad una nel instance_eval?

Ho bisogno di qualcosa del genere per la base di un sistema di modelli Ruby su cui sto lavorando.

+0

possibile duplicato [Problemi cedevole all'interno di un blocco/lambda] (http://stackoverflow.com/questions/4982630/trouble-yielding-inside-a-block-lambda) –

risposta

5

Non è possibile utilizzare la resa in a. Piuttosto, devi passare un oggetto Proc. Questo sarebbe il nuovo codice:

def do_something(a,&b) 
    AnotherClass.instance_exec(b, &a) 
end 

a = Proc.new do |b| 
    puts "start" 
    b.call 
    puts "end" 
end 

do_something(a) do 
    puts "this block is b!" 
end 

yield è solo per i metodi. In questo nuovo codice, ho usato instance_exec (nuovo in Ruby 1.9) che consente di passare i parametri al blocco. Per questo motivo, possiamo passare l'oggetto Proc b come parametro a a, che può chiamarlo con Proc#call().

0
 
a=Proc.new do |b| 
    puts "start" 
    b.call 
    puts "end" 
end 
def do_something(a,&b) 
    AnotherClass.instance_eval { a.call(b) } 
end 
+0

Questo non funzionerà. 'instance_eval' non cattura le variabili nello stesso modo dei normali blocchi. – Linuxios

Problemi correlati