binding
.
Cuando se llama este método en un proc o en una lambda retorna un objeto
Binding que representa las ligaduras en efecto para esa clausura.
Los bindings conllevan mas que variables: guardan toda la
información necesaria para poder ejecutar el método incluyendo el
valor de self y - si existe - el bloque que será
ejecutado con
yield |
# Return a lambda that retains or "closes over" the argument n def multiplier(n) lambda {|data| data.collect{|x| x*n } } end doubler = multiplier(2) # Get a lambda that knows how to double puts doubler.call([1,2,3]) # Prints 2,4,6
El Módulo Kernel proporciona la función global eval que admite como segundo argumento un objeto Binding que provee el contexto para evaluar la cadena de código Ruby:
eval("n=3", doubler.binding) # Or doubler.binding.eval("n=3") in Ruby 1.9 puts doubler.call([1,2,3]) # Now this prints 3,6,9!Como atajo, el método eval nos permite pasar directamente un objeto Proc en vez de pasar el Binding del objeto Proc:
eval("n=3", doubler)
El método binding de Kernel retorna un objeto Binding que representa los bindings en efecto en el punto de la llamada.
[~/Chapter6MethodsProcsLambdasAndClosures]$ cat binding.rb def tutu(p) x = 4 x = 2*p return [p, binding] end p, b = tutu(8) p eval("p", b) # 8 p eval("x", b) # 16
Casiano Rodriguez León 2015-01-07