Sobes.tech
Junior

Ruby'da modullar nima uchun ishlatiladi?

sobes.tech AI

AIdan javob

Ruby'da modüller ikki asosiy maqsad uchun ishlatiladi:

  1. Namespaces (Nomi bo'sh joylar): Kodni tashkil qilish, nomlar to'qnashuvlarini oldini olish uchun. Ular bog'liq sinflar, metodlar va konstantalarni bir nom ostida guruhlash imkonini beradi. Bu, ikki xil sinf yoki metodning bir xil nomga ega bo'lishi holatlarini oldini oladi.

    # module_for_namespace.rb
    module MeningFramework
      class Validatsiya
        def validatsiya(ma'lumotlar)
          # validatsiya logikasi
        end
      end
    end
    
    # boshqa_fayl.rb
    # MeningFramework'dan Validatsiya ni ishlatish uchun:
    validatsiya = MeningFramework::Validatsiya.new
    validatsiya.validatsiya("ba'zi ma'lumotlar")
    
  2. Mixins (Aralashmalar): Bir nechta sinf o'rtasida funksionallik (metodlar)ni umumiy qilish mexanizmi. Modullar include yoki prepend yordamida sinflarga qo'shiladi.

    • include: Modul metodlari sinfning ob'ektlarida mavjud bo'ladi va sinfda qayta yozilishi mumkin. Metodlarni qidirish tartibi: joriy sinf, qo'shilgan modul, super sinflar.
    • prepend: Modulni sinfdan oldin meroslar zanjiriga qo'shadi. Modul metodlari sinf metodlaridan ustun bo'ladi.

    include misoli:

    # mixin_module.rb
    module Loggable
      def log(xabar)
        puts "[LOG] #{xabar}"
      end
    end
    
    # class_using_mixin.rb
    class MeningSinf
      include Loggable # Loggable modulini qo'shish
    
      def ma'lumotlarni_ishlash
        log("Ma'lumotlar ishlanmoqda...") # Moduldagi metodni ishlatish
        # qolgan logika
      end
    end
    
    ob = MeningSinf.new
    ob.ma'lumotlarni_ishlash
    

    prepend misoli:

    # mixin_module.rb
    module MeningPrependModul
      def salom
        puts "Moduldan salom!"
      end
    end
    
    # class_with_prepend.rb
    class MeningPrependSinf
      prepend MeningPrependModul # Modul sinfdan oldin meroslar zanjirida
    
      def salom
        puts "Sinfdan salom!"
      end
    end
    
    ob = MeningPrependSinf.new
    ob.salom # "Moduldan salom!" chiqaradi, chunki modul metodlari ustun
    

Modullar instansiya qilinmaydi (obyekt yaratib bo'lmaydi) va ular sinflar kabi meroslar zanjiriga ega emas.