Blocuri, Procs și Lambdas în Ruby: yield, &block și Diferențele de Aritate în Ruby

Ghid complet pentru programare funcțională în Ruby: transmiterea blocurilor cu yield, obiecte Proc, expresii lambda (->) și diferențele majore la return și aritate.

Sintaxă
def f; yield; end | l = ->(x) { x * 2 } | p = Proc.new { |x| x }

Blocurile sunt inima stilului idiomatic de programare în Ruby. Un bloc este o bucată de cod anonimă delimitată prin do ... end sau acolade { ... } pasată oricărei metode. În interiorul metodei, blocul este apelat prin cuvântul-cheie yield.

Pentru a stoca un bloc într-o variabilă, Ruby oferă două obiecte: Proc și lambda.

Utilizarea cuvântului yield și verificarea block_given?
# Metodă care execută un bloc și măsoară timpul de execuție:
def masoara_timp
  start = Time.now
  # block_given? verifică dacă apelantul a furnizat un bloc:
  if block_given?
    yield # execută codul din blocul pasat
  else
    puts "Niciun bloc furnizat!"
  end
  final = Time.now
  puts "Durată totală: #{final - start} secunde."
end

# Invocarea metodei cu un bloc:
masoara_timp do
  puts "Se execută calcule complexe..."
  sleep(0.5)
end

Diferența critică dintre Proc și Lambda

Proc vs. Lambda la verificarea argumentelor și return
# 1. Lambda verifică strict numărul de argumente (aritatea):
o_lambda = ->(a, b) { puts "a: #{a}, b: #{b}" }
# o_lambda.call(1) # Aruncă ArgumentError (wrong number of arguments)!

# 2. Proc este permisiv (atribuie nil argumentelor lipsă):
un_proc = Proc.new { |a, b| puts "a: #{a}, b: #{b}" }
un_proc.call(1) # Ieșire: a: 1, b: nil (nu dă eroare)

# 3. Comportamentul instrucțiunii 'return':
# Într-o lambda, 'return' iese doar din corpul lambdei.
# Într-un Proc, 'return' iese forțat din METODA care a creat Proc-ul!
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: Blocuri, Procs și Lambdas în Ruby: yield, &block și Diferențele de Aritate

Ai o nelămurire despre utilizarea comenzii Blocuri, Procs și Lambdas în Ruby: yield, &block și Diferențele de Aritate sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.