Sobes.tech
Junior

Do czego służą moduły w Ruby?

sobes.tech AI

Odpowiedź od AI

Moduły w Ruby służą do dwóch głównych celów:

  1. Namespaces (Przestrzenie nazw): Organizacja kodu w celu zapobiegania konfliktom nazw. Pozwalają grupować powiązane klasy, metody i stałe pod jednym nazwiskiem. Pomaga to uniknąć sytuacji, gdy dwie różne klasy lub metody mają tę samą nazwę.

    # module_for_namespace.rb
    module MojeFramework
      class Validator
        def validate(dane)
          # logika walidacji
        end
      end
    end
    
    # inny_plik.rb
    # Aby użyć Validator z MojeFramework:
    validator = MojeFramework::Validator.new
    validator.validate("niektóre dane")
    
  2. Mixins (Mieszanki): Mechanizm do współdzielenia funkcjonalności (metod) między wieloma klasami bez użycia klasycznego dziedziczenia. Moduły są włączane do klas za pomocą include lub prepend.

    • include: Metody modułu są dostępne w instancjach klasy i mogą być nadpisywane w samej klasie. Poszukiwanie metod odbywa się w kolejności: bieżąca klasa, dołączony moduł, klasy nadrzędne.
    • prepend: Wstawia moduł w łańcuch dziedziczenia przed klasą. Metody modułu mają priorytet nad metodami klasy.

    Przykład użycia include:

    # mixin_module.rb
    module Loggable
      def log(mesaj
        puts "[LOG] #{mesaj}"
      end
    end
    
    # class_using_mixin.rb
    class MojaKlasa
      include Loggable # Dołączamy moduł Loggable
    
      def process_dane
        log("Przetwarzanie danych...") # Używamy metody z modułu
        # reszta logiki
      end
    end
    
    ob = MojaKlasa.new
    ob.process_dane
    

    Przykład użycia prepend:

    # mixin_module.rb
    module MójPrependowanyModuł
      def przywitaj
        puts "Witaj z modułu!"
      end
    end
    
    # class_with_prepend.rb
    class MojaPrependKlasa
      prepend MójPrependowanyModuł # Moduł poprzedza klasę w łańcuchu dziedziczenia
    
      def przywitaj
        puts "Witaj z klasy!"
      end
    end
    
    ob = MojaPrependKlasa.new
    ob.przywitaj # Wyświetli "Witaj z modułu!" ponieważ metoda z modułu ma priorytet
    

Moduły nie mogą być instancjonowane (nie można utworzyć obiektu modułu) i nie mają łańcucha dziedziczenia w tym samym sensie co klasy.