Vous pouvez utiliser quelque chose de similaire à Instance Eval avec délégation motif, utilisé - par exemple - dans Savon gemme:
def batman(task, &block)
@original_self = eval('self', block.binding)
puts "Batman: #{task} - done"
instance_exec('feed cat', &block)
@news << task
end
private
def method_missing(method, *args, &block)
if @original_self
@original_self.send(method, *args, &block)
else
super
end
end
Dans cette approche, lorsque vous appelez la méthode (avec un récepteur implicite) à l'intérieur du bloc passé dans batman
Méthode, cela s'appelle dans le contexte de SuperHeros
exemple. S'il n'y a pas de méthode de ce type, l'appel passe (à travers method_missing
) au bloc d'origine self
.