Sobes.tech
Junior

Na čo sa používajú moduly v Ruby?

sobes.tech AI

Odpoveď od AI

Moduly v Ruby sa používajú na dva hlavné účely:

  1. Namespace (Priestor mien): Organizácia kódu na zabránenie konfliktom mien. Umožňujú skupinovať súvisiace triedy, metódy a konštanty pod jedným menom. To pomáha vyhnúť sa situácii, keď dva rôzne triedy alebo metódy majú rovnaké meno.

    # module_for_namespace.rb
    module MyFramework
      class Validator
        def validate(data)
          # logika validácie
        end
      end
    end
    
    # another_file.rb
    # Na použitie Validator z MyFramework:
    validator = MyFramework::Validator.new
    validator.validate("nejaké dáta")
    
  2. Mixins (Miešanie): Mechanizmus na spoločné používanie funkčnosti (metód) viacerými triedami bez použitia klasického dedičstva. Moduly sa zahrňujú do tried pomocou include alebo prepend.

    • include: Metódy modulu sa stávajú dostupnými v inštanciách triedy a môžu byť prepísané v samotnej triede. Vyhľadávanie metód prebieha v nasledovnom poradí: aktuálna trieda, zahrnutý modul, supertriedy.
    • prepend: Vloží modul do reťazca dedičstva pred triedu. Metódy modulu majú prioritu pred metódami triedy.

    Príklad použitia include:

    # mixin_module.rb
    module Loggable
      def log(message)
        puts "[LOG] #{message}"
      end
    end
    
    # class_using_mixin.rb
    class MyClass
      include Loggable # Zahrnieme modul Loggable
    
      def process_data
        log("Spracovanie dát...") # Používame metódu z modulu
        # zvyšok logiky
      end
    end
    
    obj = MyClass.new
    obj.process_data
    

    Príklad použitia prepend:

    # mixin_module.rb
    module MyPrependedModule
      def greet
        puts "Ahoj z modulu!"
      end
    end
    
    # class_with_prepend.rb
    class MyPrependClass
      prepend MyPrependedModule # Modul bude pred triedou v reťazci dedičstva
    
      def greet
        puts "Ahoj z triedy!"
      end
    end
    
    obj = MyPrependClass.new
    obj.greet # Vypíše "Ahoj z modulu!", pretože metóda z modulu má prioritu
    

Moduly nemôžu byť inštancované (nie je možné vytvoriť objekt modulu) a nemajú reťazec dedičstva v rovnakom zmysle ako triedy.