Sobes.tech
Junior

K čemu slouží moduly v Ruby?

sobes.tech AI

Odpověď od AI

Moduly v Ruby se používají pro dva hlavní účely:

  1. Namespaces (Prostory jmen): Organizace kódu k zabránění konfliktům jmen. Umožňují seskupit související třídy, metody a konstanty pod jedno jméno. To pomáhá zabránit situacím, kdy dvě různé třídy nebo metody mají stejné jméno.

    # module_for_namespace.rb
    module MůjFramework
      class Validátor
        def validovat(data)
          # logika validace
        end
      end
    end
    
    # jiný_soubor.rb
    # Pro použití Validátoru z MůjFramework:
    validátor = MůjFramework::Validátor.new
    validátor.validovat("nějaká data")
    
  2. Mixins (Směsi): Mechanismus pro sdílení funkčnosti (metod) mezi více třídami bez použití klasického dědičnosti. Moduly jsou vkládány do tříd pomocí include nebo prepend.

    • include: Metody modulu jsou dostupné v instancích třídy a mohou být přepsány ve třídě. Vyhledávání metod následuje pořadí: aktuální třída, vložený modul, nadtřídy.
    • prepend: Vkládá modul před třídu do řetězce dědičnosti. Metody modulu mají přednost před metodami třídy.

    Příklad použití include:

    # mixin_module.rb
    module Loggable
      def log(zpráva)
        puts "[LOG] #{zpráva}"
      end
    end
    
    # class_using_mixin.rb
    class MojeTřída
      include Loggable # Včlenění modulu Loggable
    
      def zpracovat_data
        log("Zpracovávám data...") # Použití metody z modulu
        # další logika
      end
    end
    
    objekt = MojeTřída.new
    objekt.zpracovat_data
    

    Příklad použití prepend:

    # mixin_module.rb
    module MůjPrependModul
      def pozdrav
        puts "Ahoj z modulu!"
      end
    end
    
    # class_with_prepend.rb
    class MůjPrependTřída
      prepend MůjPrependModul # Modul předchází třídě v řetězci dědičnosti
    
      def pozdrav
        puts "Ahoj z třídy!"
      end
    end
    
    objekt = MůjPrependTřída.new
    objekt.pozdrav # Vytiskne: "Ahoj z modulu!" protože metoda z modulu má prioritu
    

Moduly nelze instanciovat (nelze vytvořit objekt modulu) a nemají řetězec dědičnosti ve stejném smyslu jako třídy.