Ruby · Avançado · Inglês · Técnico
instance exec
Método de BasicObject que executa um bloco com self trocado para o objeto, como instance_eval, mas permite passar argumentos ao bloco. Muito usado para montar DSLs.
Onde usar
Aparece em DSLs e em frameworks que executam lambdas no contexto de um objeto, como callbacks e escopos. Mantém o acesso às variáveis locais do bloco.
Em código
class Pedido
def initialize; @total = 100; end
end
bloco = proc { |desc| @total - desc }
pedido = Pedido.new
p pedido.instance_exec(10, &bloco) # => 90Exemplos
The DSL runs your block with instance_exec.
A DSL roda seu bloco com instance_exec.
Unlike instance_eval, instance_exec passes arguments in.
Ao contrário do instance_eval, o instance_exec repassa argumentos.
Cuidado
Só o self muda; as variáveis locais continuam as do bloco. Não o use para quebrar o encapsulamento sem necessidade.