porque no profundizan? es que ni documentacion dejan!! el curso parece que lo hacen a la carrera 😦, dejo una fuente para aclarar mas la diferencia entre, proc, lambdas y blocks
Introducción
Lo que aprenderás sobre Ruby
Qué es Ruby y para qué sirve este lenguaje
Instalación de Ruby
Bases del lenguaje
Tipos de datos I: Integer, float
Tipos de datos II: Strings
Tipos de datos III: Symbols
Tipos de datos IV: Arrays
Tipos de datos V: Hashes
Uso de condicionales
Uso de ciclos
Rangos
Uso de Regex
Procs y lambdas
Programación Orientada a Objetos en Ruby Comenzando la creación de nuestra clase
Programación Orientada a Objetos en Ruby: Módulos
Programación Orientada a Objetos: Clases y Objetos
Concurrencia vs Paralelismo: Threads en Ruby
Bundler y gemas
Testing en Ruby
Testing con MiniTest
Diferencias entre Ruby 2.5 y 3
Proyecto
Introducción al proyecto
Instalar Ruby 2D
Overview Ruby 2D
Arquitectura
Estructurando el proyecto
Vista básica
Programando la base para los movimientos
Programando el movimiento de nuestro snake
Test de nuestras acciones
Implementando el timer del movimiento
Actualizando la vista
Preparando el cambio de dirección
Recapitulación de la arquitectura
Moviendo la serpiente con el teclado
Creciendo la serpiente y programando la condición de derrota
Generando comida aleatoria: uso de rand y stub en pruebas
Condición de salida y conclusiones
Retos del curso
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Convierte tus certificados en títulos universitarios en USA
Antes: $249
Paga en 4 cuotas sin intereses
Termina en:
Simón Soriano
Aportes 18
Preguntas 1
porque no profundizan? es que ni documentacion dejan!! el curso parece que lo hacen a la carrera 😦, dejo una fuente para aclarar mas la diferencia entre, proc, lambdas y blocks
Proc
Procedimiento return en un proc
Siempre que intentemos utilizar la palabra reservada return en un proc debemos tener en cuenta que :
Lambda
Conceptos extraídos de:
Hey, chicos si no entendieron muy bien lo de los Procs y las lambdas, o quedaron con muchas dudas. Este vídeo lo explica perfectamente
Este es el código que verán el vídeo más un pequeños apuntes:
# Procs
# Los procs se comportan como bloques. Se recomienda pasar el Proc de forma explícita
def run_proc_w_random_number(proc)
proc.call(rand(100))
end
proc = Proc.new { |number| puts "#{number}" }
run_proc_w_random_number(proc)
# No tan buen en performace la siguiente, pero no se recomienda
def run_proc_w_random_number(&proc)
proc.call(rand(100))
end
run_proc_w_random_number { |number| puts "#{number}" }
# Lambdas
# Las lambdas utiliza un return de la misma forma que hace un método
def return_from_proc
a = Proc.new { return 10 }.call
puts 'This will never be printed'
end
def return_from_lambda
# a = lambda { return 10 }.call
a = -> { return 10 }.call
puts "The lambda returned #{a}"
end
return_from_proc
return_from_lambda
En Ruby un Proc o lambda es una clase especial que hace una referencia a un método. Estos lambdas son utilizados para hacer programación funcional.
# 1. Declarar un proc
saludar = Proc.new { |nombre| puts "Hola #{nombre}" }
# 2. LLamar a ese procedimiento
saludar.call("Carmen")
Hey!! 😉 Si alguien sigue por aquí y está estudiando Ruby, hace poco unos amigos y yo hemos creado un grupo de Telegram para Devs, si te interesa unirte, aquí el link:
Por cierto, amo muchísimo la sintaxis de Ruby 😍 (igualmente quede como un ocho en está clase) Video para entenderla mejor:
Mejoraría el código de la actividad así:
class Transaction
def exec
puts "ejecutando transaccion"
if block_given?
yield
else
puts "no se recibio un bloque. Transaccion abortada"
end
end
end
Luego al ejecutar el código se entenderá que si no se recibe un bloque fallará la transacción
Los Proc: Es una clase con metodos ya establecidos y en este caso lo usan para crear funciones pero al crear una nueva instancia “saludar” esta recibe todas los metodos por defecto y aparte hace lo que creas dentro de las llaves.
saludar = Proc.new { |nombre| puts “hola #{nombre}” }
Bueno si le agregaba una linea hubiera quedado mas clara la explicacion.
y para resumir:
tx.exec { put “Despues de la transaccion” }
tx.exec # Es una instancia de la clase transaccion llamando el metodo exec.
{ put “Despues de la transaccion” } # block o bloque que se ingresa.
class Transaction
def exec
puts "Ejecutando Transaccion"
if block_given?
puts "Ingreso Bloque" #<<<<< linea nueva
yield
end
end
end
Tuve que estudiar más de una hora solo sobre blocks, procs y lambdas. Deberian profundizar en el tema
yield, de aca se copia JS con los generators, JUMMM
Un bloque es el código que se encuentra entre braces
{ todo esto será un bloque de codigo a ejecutar }
También lo que está escrito entre un do y un end
def try
if block_given?
yield
else
"no block"
end
end
try #=> "no block"
try { "hello" } #=> "hello"
try do "hello" end #=> "hello"
soy el unico que tiene que poner el video en 0.5x , para poder entenderlo? no veo la necesidad de correr tanto
Honestamente y para mejorar en un futuro, no entendi muy bien este apartado.
“Lo primero que vamos hacer es declarar un Proc… Digamos que quiero declarar un lambda”
WTF!??
Me costó demasiado pero al fin creo entender que son los bloques:
En resumen son funciones anónimas que pueden se pasadas a los métodos. En la imagen que adjunto pueden verlo cree un método llamado “greet_block” (estaba confundido al inicio pero es un método) el cual recibe como parámetro un nombre y lo imprime en consola. gracias a la palabra reservada “yield” yo puedo recibir dentro del método el bloque que le estoy pasando (lo que está en corchetes donde llamo el método)
Si pongo parentesis a yield es para pasarle parámetros al método que estoy invocando entonces gracias a eso puedo imprimir mensajes diferentes ya que el bloque que estoy pasando tiene mensajes distintos, lo que esta en parentesis en yield se recibe como n en el bloque que estoy pasando. Espero que con la imagen sea más claro…
Documentación de block_given?
http://community.logicalbricks.com/node/111
Buena informacion para comprender mejor esta parte
Que terminal está usando?
Estuve indagando y deseo compartir el siguiente código, que muestra la diferencia de los bloques especiales proc y lambda.
# Definiendo un proc
a_proc = Proc.new { puts "Hi from proc" }
#Definiendo una lambda
a_lambda = -> { puts "Hi from lambda" }
#Definiendo el método con argumento proc y lambda
def print_number(a_proc, a_lambda)
a_proc.call
yield #Se asociará al bloque de la última línea
puts "Hi from method" #Una impresión asociada a el método
a_lambda.call
end
print_number(a_proc, a_lambda) {puts "Hi from yield"}
Tomado de este post
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?