Cała oryginalna treść jest tworzona po ukraińsku. Nie wszystkie treści zostały jeszcze przetłumaczone. Niektóre posty mogą być dostępne tylko po ukraińsku.Dowiedz się więcej
Ta treść została automatycznie przetłumaczona z ukraińskiego.
W Ruby Proc to obiekt, który przechowuje fragment kodu (blok) i pozwala na jego późniejsze wykonanie. To jak "zapisany blok" lub "funkcja w pudełku".

Przykład 1: tworzymy Proc

say_hello = Proc.new { puts "Hello!" }
say_hello.call
# => "Hello!"
Stworzyliśmy obiekt Proc, który przechowuje kod { puts "Hello!" }. Następnie wywołaliśmy go za pomocą .call.

Przykład 2: przekazujemy Proc do metody

def run_twice(proc)
  proc.call
  proc.call
end

run_twice(Proc.new { puts "Hi!" })
# => "Hi!"
# => "Hi!"
Przekazaliśmy blok kodu jako obiekt i wywołaliśmy go kilka razy. To bardzo wygodne, gdy trzeba ponownie wykorzystać logikę.

Proc - dlaczego taka nazwa?

Łatwiej zapamiętywać nazwy metod, gdy wiesz, co one oznaczają. Nazwa Proc w Ruby to skrót od "Procedure" (procedura). W językach programowania, jeszcze od czasów Lisp i Scheme, termin procedure oznaczał "fragment kodu, który można wykonać później" - czyli funkcję, którą można przekazać jako argument lub wywołać.
Kiedy Matzumoto (Matz), twórca Ruby, projektował język, chciał, aby Ruby miał prosty i elastyczny sposób pracy z blokami kodu. Wziął pomysł procedur z Lisp/Scheme i uczynił je obiektami - tak powstała klasa Proc (procedure object).

Co to jest Lambda?

Lambda to też Proc, ale z pewnymi różnicami. Można ją stworzyć na kilka sposobów:
-> { }
say_hi = -> { puts "Hi!" }
say_hi.call
# => "Hi!"
oraz lambda {}
say_hello = lambda { puts "Hello!" }
Aby udowodnić, że lambda to proc:
say_hi.class
=> Proc

Podstawowa różnica między Proc a Lambda

1. Lambda sprawdza liczbę argumentów, a Proc - nie.
p1 = Proc.new { |a, b| puts a, b }
l1 = ->(a, b) { puts a, b }

p1.call(1)
# => 1
# => nil   (drugi argument to po prostu nil)

l1.call(1)
# => ArgumentError: wrong number of arguments
2. return w Proc wychodzi z całej metody, a nie tylko z Proc. W Lambda return kończy tylko samą lambdę.
Przyjrzyjmy się przykładom
def test_proc
  p = Proc.new { return "From Proc" }
  p.call
  "After Proc"  # ten wiersz nie zostanie wykonany
end

puts test_proc
# => "From Proc"
Kiedy Proc wywołuje return, natychmiast wychodzi z metody, w której został stworzony Proc, a nie tylko z bloku.
return w Lambda kończy tylko samą lambdę
def test_lambda
  l = -> { return "From Lambda" }
  result = l.call
  "After Lambda: #{result}"  # ten wiersz zostanie wykonany
end

puts test_lambda
# => "After Lambda: From Lambda"
Lambda zachowuje się jak zwykła metoda: return kończy tylko samą lambdę, a metoda kontynuuje wykonanie dalej.

& i to_proc

Kiedy przekazujesz w Ruby obiekt z ampersandem &, Ruby próbuje wywołać na nim .to_proc i używa otrzymanego Proc jako bloku.
def run(&block)
  block.call
end

run { puts "Works!" }
# => "Works!"
Tutaj Ruby automatycznie wywołał .to_proc dla naszego bloku { ... } i przekazał go do zmiennej block.

Ten post nie ma jeszcze żadnych dodatków od autora.

Jak działają tablice w Ruby: praktyczne przykłady each, map, select, inject, reduce, filter_map
28 paź 10:38

Jak działają tablice w Ruby: praktyczne przykłady each, map, select, inject, reduce, filter_map

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Jak działa self, protected i private (Ruby)
28 paź 13:52

Jak działa self, protected i private (Ruby)

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Dzielenie całkowite w Ruby: dlaczego 6 / 4 równa się 1
28 paź 14:10

Dzielenie całkowite w Ruby: dlaczego 6 / 4 równa się 1

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
28 paź 14:42

Jak działa &:to_s w Ruby i co to jest Symbol#to_proc

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Co się stanie, jeśli wywołasz [1, 2, 3].map(&Person)
29 paź 17:54

Co się stanie, jeśli wywołasz [1, 2, 3].map(&Person)

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Klasa Singleton (eigenclass) w Ruby: co to jest i po co to potrzebne
29 paź 18:29

Klasa Singleton (eigenclass) w Ruby: co to jest i po co to potrzebne

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
==, equal?, eql?, === w Ruby: co sprawdzają i kiedy używać
29 paź 20:47

==, equal?, eql?, === w Ruby: co sprawdzają i kiedy używać

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Include, Extend, Prepend w Ruby: jak działają i jaka jest różnica
29 paź 21:20

Include, Extend, Prepend w Ruby: jak działają i jaka jest różnica

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
module_function w Ruby: kiedy metody modułu są dostępne jako modułowe i jako funkcje
29 paź 21:53

module_function w Ruby: kiedy metody modułu są dostępne jako modułowe i jako funkcje

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Czym jest memoizacja w Ruby?
30 paź 10:17

Czym jest memoizacja w Ruby?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska