Sobes.tech
Junior

Kam skirti Ruby moduliai?

sobes.tech AI

Atsakymas iš AI

Ruby moduli naudojami dviem pagrindinėms reikmėms:

  1. Namespaces (Vardų erdvės): Kodo organizavimas siekiant išvengti vardų konfliktų. Jie leidžia grupuoti susijusius klases, metodus ir konstantas po vienu pavadinimu. Tai padeda išvengti situacijos, kai du skirtingi klasės ar metodai turi tą patį pavadinimą.

    # module_for_namespace.rb
    module MyFramework
      class Validator
        def validate(data)
          # validacijos logika
        end
      end
    end
    
    # another_file.rb
    # Validator naudojimas iš MyFramework:
    validator = MyFramework::Validator.new
    validator.validate("kai kurie duomenys")
    
  2. Mixins (Mišinius): Mechanizmas, leidžiantis bendrą funkcionalumą (metodus) naudoti keliuose klasiuose be tradicinės paveldėjimo schemos. Modulius įtraukia į klases naudojant include arba prepend.

    • include: Modulio metodai tampa prieinami klasių egzemplioriuose ir gali būti perrašyti pačioje klasėje. Metodų paieška vyksta tokiu eiliškumu: dabartinė klasė, įtrauktas modulis, superklasės.
    • prepend: Modulis įtraukiamas į paveldėjimo grandinę prieš klasę. Modulio metodai turi pirmenybę prieš klasės metodus.

    Pavyzdys naudojant include:

    # mixin_module.rb
    module Loggable
      def log(message)
        puts "[LOG] #{message}"
      end
    end
    
    # class_using_mixin.rb
    class MyClass
      include Loggable # įtraukiame Loggable modulį
    
      def process_data
        log("Duomenų apdorojimas...") # naudojame modulio metodą
        # kita logika
      end
    end
    
    obj = MyClass.new
    obj.process_data
    

    Pavyzdys naudojant prepend:

    # mixin_module.rb
    module MyPrependModule
      def greet
        puts "Sveiki iš modulio!"
      end
    end
    
    # class_with_prepend.rb
    class MyPrependClass
      prepend MyPrependModule # modulis bus prieš klasę paveldėjimo grandinėje
    
      def greet
        puts "Sveiki iš klasės!"
      end
    end
    
    obj = MyPrependClass.new
    obj.greet # išves "Sveiki iš modulio!", nes modulio metodas turi pirmenybę
    

Moduliai negali būti instancijuojami (neįmanoma sukurti modulio objekto) ir neturi paveldėjimo grandinės tokiu pačiu būdu kaip ir klasės.