A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Curso de Ruby

Curso de Ruby

Sim贸n Soriano

Sim贸n Soriano

Procs y lambdas

13/39
Recursos

Aportes 13

Preguntas 1

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Proc

  • Un bloque no es un objeto, es parte de la sintaxis de ejecuci贸n de un m茅todo, por tanto no tiene las funcionalidades de un objeto.
  • Podemos simular la funcionalidad de un objetos al pasar un bloque como un 鈥減roc鈥, la sintaxis dice que antes del nombre de la variable de m茅todo se bebe utilizar el signo 鈥&鈥 el cual le indica a ruby que el bloque que se esta pasando en realidad se trata de un objeto 鈥減roc鈥
  • Un m茅todo solo puede recibir un bloque, pero puede recibir varios 鈥減roc鈥
  • Es las lenta la ejecuci贸n de un proc que la de un bloque

Procedimiento return en un proc

Siempre que intentemos utilizar la palabra reservada return en un proc debemos tener en cuenta que :

  • Para un proc se debe llamar un metodo y dentro del m茅todo declarar el procedimiento que a utilizar.
  • Si no lo hacemos de este modo nos retornara Error 鈥渓ocal jump error鈥 porque esta tratando de ejecutar un return de primer nivel

Lambda

  • Una 鈥渓ambda鈥 es una funci贸n an贸nima (sin nombre), su sintaxis es 鈥渓ambda {鈥鈥 o tambi茅n utilizando la sintaxis de flecha 鈥->(){}鈥
  • Hay similitudes muy grandes entre los 鈥減rocs鈥 y las 鈥渓ambdas鈥, lo que los diferencia es que un 鈥減roc鈥 se comporta como un bloque, mientras que una 鈥渓ambda鈥 se comporta como un m茅todo
  • A una 鈥渓ambda鈥 se le pueden pasar argumentos, pero al igual que a un metodo estos deben pasarse en el mismo orden que fueron llamados y son obligatorios, lo que no sucede en un 鈥減roc鈥 pues para este es opcional
  • Cuando se hace 鈥渞eturn鈥 de una desde una 鈥渓ambda鈥 se detiene la ejecuci贸n del m茅todo (lambda), pero no se detiene la ejecuci贸n de donde fue llamado (otro m茅todo), caso contrario si estamos trabajando con bloques que si termina la ejecucion del metodo donde fue llamado

Conceptos extra铆dos de:

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

aqui

Datos especiales: Procs y lambdas


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

Ejercicio de la clase

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:

https://t.me/HackTzi


Por cierto, amo much铆simo la sintaxis de Ruby 馃槏 (igualmente quede como un ocho en est谩 clase) Video para entenderla mejor:

Este v铆deo lo explica perfectamente

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

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.

Documentaci贸n de block_given?

yield, de aca se copia JS con los generators, JUMMM

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