Sobes.tech
Middle

Czym jest lambda i procedura w Ruby?

sobes.tech AI

Odpowiedź od AI

Lambda i procedura w Ruby to obiekty Proc, które kapsułkują bloki kodu.

Główne różnice dotyczą zachowania przy zwracaniu wartości i liczby przyjmowanych argumentów:

  • Lambda:

    • Ściśle kontroluje liczbę argumentów (jak zwykła metoda).
    • return wewnątrz lambda zwraca wartość tylko z samej lambda.
    # Przykład lambda
    lambda_proc = lambda { |a, b| return a + b }
    puts lambda_proc.call(1, 2) # 3
    
    # Błąd: nieprawidłowa liczba argumentów
    # lambda_proc.call(1)
    
  • Proc:

    • Mniej rygorystyczny wobec liczby argumentów (może nie wywołać błędu, jeśli jest ich więcej lub mniej niż oczekiwano).
    • return wewnątrz procedury zwraca wartość z kontekstu, w którym została zdefiniowana (jak return w bloku).
    # Przykład procedury
    proc_proc = Proc.new { |a, b| return a + b }
    
    def method_with_proc
      proc_proc = Proc.new { return "powrót z metody" }
      proc_proc.call
      "ten tekst nie zostanie pokazany"
    end
    
    puts method_with_proc # powrót z metody
    
    # Nie wywołuje błędu przy nieprawidłowej liczbie argumentów (choć zachowanie może być nieprzewidywalne)
    # proc_proc.call(1)
    

Porównanie:

Charakterystyka Lambda Proc
Kontrola argumentów Ścisła Niestronna
Zachowanie return Zwraca z samej lambda Zwraca z kontekstu
Klasa Proc (ale z flagą lambda?) Proc
Tworzenie lambda { ... }, -> { ... } Proc.new { ... }, proc { ... }

W większości przypadków, do przekazywania bloków zachowania podobnych do metod, lepiej używać lambda ze względu na ich bardziej przewidywalne zachowanie z argumentami i return. Procedury częściej używa się do zadań niskopoziomowych lub tam, gdzie ich specyficzne zachowanie return jest pożądane.