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.callTworzenie 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 resultPrzekazywanie 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 demoObiekty 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 { }lubProc.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ą
returnna poziomie metody.
pipeline = [proc { |s| s.upcase }, proc { |s| s + "!" }]
text = "hello"
pipeline.each { |step| text = step.call(text) }
puts textSzybki 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
returnna 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.