0Pricing
Ruby Academy · Lekcja

Procki

Obiekty wielokrotnego użytku reprezentujące bloki

Procki to bezpłatna lekcja Ruby Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Ruby Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Ruby Academy zawiera 4 lekcji w sumie.

Obiekty bloków wielokrotnego użytku

Blok sam w sobie nie jest obiektem, dlatego nie można przechowywać go w zmiennej. Obiekt Proc opakowuje blok w rzeczywisty obiekt, który można zapisać, przekazywać dalej i wywołać później.

greeter = Proc.new { puts "Hello!" }
greeter.call
greeter.call

Tworzenie obiektów Proc

Istnieją dwa popularne sposoby utworzenia obiektu Proc: Proc.new { ... } oraz krótsza metoda Kernel proc { ... }. Oba tworzą obiekt tego samego rodzaju.

double = proc { |x| x * 2 }
p double.call(5)

Wywoływanie obiektu Proc

Obiekt Proc można wywołać na kilka sposobów: za pomocą .call, .() oraz skróconej składni z nawiasami kwadratowymi [ ]. Są one równoważne.

square = proc { |x| x * x }
puts square.call(4)
puts square.(4)
puts square[4]

Obiekty Proc przyjmują argumenty

Obiekty Proc przyjmują parametry tak jak bloki; parametry deklaruje się między pionowymi kreskami.

add = proc { |a, b| a + b }
puts add.call(3, 7)

Przechowywanie obiektów Proc w tablicach

Ponieważ obiekty Proc są obiektami, można przechowywać kolekcję zachowań i uruchamiać je po kolei.

ops = [proc { |x| x + 1 }, proc { |x| x * 2 }]
result = 5
ops.each { |op| result = op.call(result) }
puts result

Przekazywanie obiektu Proc jako bloku

Dodaj przed obiektem Proc znak &, aby przekazać go metodzie oczekującej bloku. Ruby ponownie rozpakowuje go do postaci bloku.

printer = proc { |n| puts "Item: #{n}" }
[1, 2, 3].each(&printer)

Przechwytywanie bloków jako obiektów Proc

Działa również odwrotna konwersja: &block w sygnaturze metody przechwytuje przekazany blok jako obiekt Proc, który można przechowywać.

def make_handler(&block)
  block
end
h = make_handler { |msg| puts "Got: #{msg}" }
h.call("ping")

Obiekty Proc nie wymagają dokładnej liczby argumentów

To ich ważna cecha: obiekty Proc nie zgłaszają błędu przy nieprawidłowej liczbie argumentów. Brakujące argumenty przyjmują wartość nil, a nadmiarowe są ignorowane.

p1 = proc { |a, b| puts "a=#{a.inspect} b=#{b.inspect}" }
p1.call(1)
p1.call(1, 2, 3)

Obiekty Proc a return

return wewnątrz obiektu Proc powoduje powrót z otaczającej metody, a nie tylko z obiektu Proc. Może to być zaskakujące, dlatego należy zachować ostrożność.

def demo
  p = proc { return 10 }
  p.call
  20  # never reached
end
puts demo

Obiekty Proc przechwytują otoczenie

Obiekt Proc zapamiętuje zmienne dostępne w zakresie, w którym go zdefiniowano. Dzięki temu jest domknięciem — zagadnieniem, które zostanie omówione szerzej później.

factor = 3
times_factor = proc { |n| n * factor }
puts times_factor.call(10)

Składanie wszystkiego w całość

Obiekty Proc zamieniają bloki w pełnoprawne obiekty:

  • Tworzy się je za pomocą proc { } lub Proc.new.
  • Uruchamia się je za pomocą .call, .() lub [ ].
  • Przekazuje się je do metod za pomocą &.
  • Nie wymagają dokładnej liczby argumentów i używają return na poziomie metody.
pipeline = [proc { |s| s.upcase }, proc { |s| s + "!" }]
text = "hello"
pipeline.each { |step| text = step.call(text) }
puts text

Szybki test

Proszę sprawdzić swoją znajomość obiektów Proc.

Podsumowanie

Omówiono obiekty Proc:

  • Obiekt Proc to blok opakowany jako obiekt.
  • Tworzy się go za pomocą proc/Proc.new, a uruchamia za pomocą .call.
  • Do metod przekazuje się go za pomocą &.
  • Toleruje niezgodność liczby argumentów i używa return na poziomie metody.
shout = proc { |word| puts word.upcase }
shout.call("ruby")

Często zadawane pytania

Czy lekcja „Procki” jest bezpłatna?

Tak — pełny tekst „Procki” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Ruby Academy, przejdź na CoddyKit PRO. Kurs Ruby Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Procki”?

Obiekty wielokrotnego użytku reprezentujące bloki Ćwiczysz Ruby Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Ruby Academy?

Nie wymagamy żadnego doświadczenia. Ruby Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Procki”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Ruby Academy?

Tak. Każda lekcja Ruby Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Powtórka bloków
  2. Procki
  3. Lambdy
  4. Domknięcia i zakres
← Powrót do Ruby Academy