2009-10-21 10 views
10

Est-il possible pour un lambda, proc, method ou autre type de bloc en rubis, de céder à un autre bloc?
quelque chose comme ...Ruby: bloc de rendement d'un bloc?

a = lambda { 
    puts 'in a' 
    yield if block_given? 
} 

a.call { puts "in a's block" } 

cela ne fonctionne pas ... il produit juste

in a 
=> nil 

est-il moyen d'obtenir le bloc d'appeler un bloc?

Répondre

8

Je ne sais pas si vous pouvez vous pouvez le faire, mais quelque chose de similaire serait la suivante:

Dans Ruby 1.8.6:

a = lambda { |my_proc| 
    puts 'in a' 
    my_proc.call 
} 

a.call(lambda { puts "in a's block" }) 

Dans Ruby 1.9.1, vous pouvez avoir bloc paramètres

a = lambda { |&block| 
    puts 'in a' 
    block.call 
} 

a.call { puts "in a's block" } 
8

Vous pouvez appeler le bloc, qui est similaire à céder.

a = lambda {|&block| block.call if block} 
a.call {print "hello"} 

Notez que

a.call 

ne renvoie pas d'erreur.

+0

Pas que ce soit une grosse affaire, mais j'ai remarqué que vous étiez le premier à répondre. –