Este "bloque idiomático" es una parte fundamental de Ruby cotidiano y se trata con frecuencia en libros y tutoriales. El Ruby information section proporciona enlaces a útiles recursos de aprendizaje [en línea].
La forma idiomática es el uso de un bloque:
def x(z)
yield z # perhaps used in conjunction with #block_given?
end
x(3) {|y| y*y} # => 9
O tal vez convertida a una Proc; aquí se muestra que el "bloque", convertida en un Proc implícitamente con &block
, es sólo otro valor "exigible":
def x(z, &block)
callback = block
callback.call(z)
end
# look familiar?
x(4) {|y| y * y} # => 16
(Sólo use el formulario de arriba para guardar el bloque-ahora-Proc para su uso posterior o en otros casos especiales, ya que implica una sobrecarga y el ruido de sintaxis)
sin embargo, un lambda se puede utilizar con la misma facilidad (pero esto no es idiomático):.
def x(z,fn)
fn.call(z)
end
# just use a lambda (closure)
x(5, lambda {|y| y * y}) # => 25
Si bien los enfoques anteriores pueden todos envoltura "llamando a un método", ya que crean los cierres, obligado Methods también pueden ser tratados como objetos no desembolsadas de primera clase:
class A
def b(z)
z*z
end
end
callable = A.new.method(:b)
callable.call(6) # => 36
# and since it's just a value...
def x(z,fn)
fn.call(z)
end
x(7, callable) # => 49
Además, a veces es útil utilizar el método #send
(en particular si se conoce un método por su nombre). Aquí guarda un objeto Método intermedio que se creó en el último ejemplo; Ruby es un sistema de paso de mensajes:
# Using A from previous
def x(z, a):
a.__send__(:b, z)
end
x(8, A.new) # => 64
Happy coding!
Esto podría ser útil: https://github.com/krisleech/wisper – Kris