Bloques, Procs y lambdas (referidos como cierres en Informática) son uno de los aspectos más poderosos de Ruby, y también uno de los más incomprendida . Esto es probablemente porque Ruby maneja los cierres de una manera bastante única. Hacer las cosas más complicadas es que Ruby tiene cuatro formas diferentes de usar cierres, cada uno de los cuales es un poco diferente, y algunas veces sin sentido. Hay bastantes sitios con información muy buena sobre cómo funcionan los cierres en Ruby. Pero todavía tengo que encontrar una buena y definitiva guía por ahí.
class Array
def iterate!(&code)
self.each_with_index do |n, i|
self[i] = code.call(n)
end
end
end
array = [1, 2, 3, 4]
array.iterate! do |n|
n ** 2
end
Procedimientos, AKA, Proc
Los bloques son muy práctico y sintácticamente simple, sin embargo es posible que desee tener muchos bloques diferentes a nuestra disposición y les utilizar varias veces. Como tal, pasar el mismo bloque una y otra vez requeriría que nos repitiéramos. Sin embargo, como Ruby está completamente orientado a objetos, se puede manejar de forma bastante limpia guardando el código reutilizable como un objeto en sí mismo. Este código reutilizable se llama Proc (abreviatura de procedimiento). La única diferencia entre bloques y Procs es que un bloque es un Proc que no se puede guardar, y como tal, es una solución de uso único. Al trabajar con procs, podemos empezar a hacer lo siguiente:
class Array
def iterate!(code)
self.each_with_index do |n, i|
self[i] = code.call(n)
end
end
end
array_1 = [1, 2, 3, 4]
array_2 = [2, 3, 4, 5]
square = Proc.new do |n|
n ** 2
end
lambdas
Proc Hasta el momento, se ha utilizado de dos maneras, pasarlas directamente como un atributo y guardarlas como una variable. Estos Procs son muy similares a lo que otros lenguajes llaman funciones anónimas, o lambdas. Para hacer las cosas más interesantes, las lambdas también están disponibles en Ruby. Echar un vistazo:
class Array
def iterate!(code)
self.each_with_index do |n, i|
self[i] = code.call(n)
end
end
end
array = [1, 2, 3, 4]
array.iterate!(lambda { |n| n ** 2 })
puts array.inspect
Bloques
El más común, más fácil y posiblemente más “Ruby como” forma de usar cierres en Ruby es con bloques. Tienen la siguiente sintaxis familiar:
array = [1, 2, 3, 4]
array.collect! do |n|
n ** 2
end
puts array.inspect
# => [1, 4, 9, 16]
¡Gracias por esto, realmente útil para mí! – duykhoa
Gracias, hombre, muy buen ejemplo, pero ¿de qué sirve llamar para inspeccionar un Fixnum? – sekmo