Inicio la sección de programación con un post sobre Ruby, lenguaje que estoy aprendiendo (fase novato) ahora mismo. Para quién no lo sepa, Ruby es un lenguaje de programación orientado a objetos, potente, rico y fácil de aprender, es multipropósito, aunque normalmente se asocia al desarrollo web.
Volviendo a la cuestión que encabeza este post, ¿cuál es la diferencia entre blocks, procs y lambdas? Estos tres elementos se utilizan para agrupar código que queremos ejecutar.
Lo más fácil de entender es que un block es un trozo de código de un método, tan solo utilizable una sola vez, tal y como podemos ver en el siguiente ejemplo:
Los procs son objectos, los blocks no lo son. Un proc llamado prc es un elemento de la clase Proc, y tal prc puede ser asociado a una variable, así como también podemos llamar métodos en él.
Los lambdas comprueban el número de argumentos que se les pasan, los procs no. Así pues:
Volviendo a la cuestión que encabeza este post, ¿cuál es la diferencia entre blocks, procs y lambdas? Estos tres elementos se utilizan para agrupar código que queremos ejecutar.
Lo más fácil de entender es que un block es un trozo de código de un método, tan solo utilizable una sola vez, tal y como podemos ver en el siguiente ejemplo:
[2,3,5,9].each { |x| x*2 } #El block es { |x| x*2 }, y lo que hace es multiplicar 2, 3, 5 y 9 por 2Algo peligroso, pero que también podemos pensar es que un proc puede servir para convertir un block en un trozo de código reutilizable, asociado a una variable.
Los procs son objectos, los blocks no lo son. Un proc llamado prc es un elemento de la clase Proc, y tal prc puede ser asociado a una variable, así como también podemos llamar métodos en él.
prc = Proc.new{ puts "Hola, soy un proc"} #Esto crea un proc llamado prc
p = prc.call #Asociamos a una variable el método call en el proc prcAhora, quienes aquí se parecen son los procs y lambdas, y vamos a resaltar en qué se diferencian. Primero, ambos son objetos de tipo Proc.
Los lambdas comprueban el número de argumentos que se les pasan, los procs no. Así pues:
la = lambda { |x| puts x*x } #Crea un lambda que multiplica por sí mismo el número que le pases, y lo muestra en pantalla
la.call(2, 3) #Provoca un error, al haberle pasado más de un argumento
prc = Proc.new { |x| puts x*x } #Crea un proc que multiplica por sí mismo el número que le pases, y lo muestra en pantalla
prc.call(2, 3) #Ruby ignora que le has pasado un número erróneo de argumentos, y devolverá tan solo el primero: 4 (2*2)Y por último, lambdas y procs se diferencian en como reaccionan ante return. Mientras que usado en lambdas, return hará que se ejecute el código que no pertenezca a lambda, usado en un proc, return hará que se ejecute el código que está fuera del trozo de código en el que el proc se ejecuta/enmcarca, en nuestro caso, fuera de la función mi_proc.
def mi_lambda
la = lambda { return }
la.call
puts {"Soy lambda"}
end
mi_lambda #Devolverá "Soy lambda" mostrado en pantalla
def mi_proc
prc = Proc.new { return }
prc.call
puts {"Soy proc"}
end
mi_proc #No devolverá nada
Y esto es todo, espero que os haya servido de ayuda. Cualquier pregunta o sugerencia la podéis dejar en los comentarios de la entrada.
Comentarios
Publicar un comentario