English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
وحدة Ruby (Module)
الوحدة (Module) هي طريقة لجمع الطرق والصفحات والمعادلات معًا. تقدم الوحدة (Module) لك ميزتين كبيرتين.يقدم الوحدةالاسم المحدد
و تجنب الاسم المتداخل. mixin الوحدة قامت بتحقيق
الاسم المحدد
الوحدة تشبه الصفحة ولكن بها فروق كما يلي:
الوحدة لا يمكن إنشاء مثيل منها
الوحدة ليس لديها فرع
الوحدة يمكن تعريفها فقط من قبل وحدة أخرى
module Identifier statement1 statement2 ........... conclusion
تسمية المعادلات في الوحدة تشبه تسمية المعادلات في الصفحة، تبدأ بالحروف الكبيرة. يبدو تعريف الطريقة أيضًا مشابهًا: تعريف الطريقة في الوحدة يشبه تعريف الطريقة في الصفحة.
من خلال الطريقة في الصفحة، يمكنك وضع اسم الوحدة أمام اسم الطريقة مع نقطة لاستدعاء طريقة الوحدة، يمكنك استخدام اسم الوحدة مع دوقتين لاستدعاء المعادلة.
#!/usr/bin/ruby # تعريف الوحدة في ملف trig.rb module Trig PI = 3.141592654 def Trig.sin(x) # .. conclusion def Trig.cos(x) # .. conclusion conclusion
يمكننا تعريف وحدات تحتوي على نفس الاسم ولكن تحتوي على وظائف مختلفة:
#!/usr/bin/ruby # تعريف الوحدة في ملف moral.rb module Moral VERY_BAD = 0 BAD = 1 def Moral.sin(badness) # ... conclusion conclusion
مثل الطريقة في الصفحة، عندما تعرف طريقة في الوحدة، يمكنك تحديد اسم الوحدة بعد نقطة، ثم اسم الطريقة.
جملة require تشبه جملة include في C و C++ و جملة import في Java. إذا كان برنامجًا ثالثًا يريد استخدام أي وحدة معينة، يمكنه ببساطة استخدام Ruby require استخدام جملة لتحميل ملفات الوحدة:
require filename
في هذا المكان، امتداد الملف .rb ليس ضروريًا.
$LOAD_PATH << '.' require 'trig.rb' require 'moral' y = Trig.sin(Trig::PI/4) wrongdoing = Moral.sin(Moral::VERY_BAD)
في هذا المكان، نستخدم $LOAD_PATH << '.' اجعل Ruby يعرف أنه يجب البحث في الملفات المشار إليها في الدليل الحالي. إذا لم تكن ترغب في استخدام $LOAD_PATH، يمكنك استخدام require_relative لإشارة إلى ملف من دليل نسبي.
ملاحظة:في هذا، يحتوي الملف على نفس أسماء الوظائف. لذا، سيؤدي هذا إلى تشويه الكود عند الاستدعاء، ولكن يمنع المodule هذا التشويه، ويمكننا استخدام اسم المodule لاستدعاء الوظيفة المناسبة.
يمكنك تضمين المodule في الفئة. من أجل تضمين المodule في الفئة، يمكنك استخدام include الجملة:
include modulename
إذا كان المodule معرفًا في ملف منفرد، فإنه يجب استخدام require تعبر عن ملف.
افترض أن المodule المكتوبة في support.rb في الملف.
module Week FIRST_DAY = "الأحد" def Week.weeks_in_month puts "تملك أربعة أسابيع في الشهر" conclusion def Week.weeks_in_year puts "تملك 52 أسبوعًا في السنة" conclusion conclusion
الآن، يمكنك استخدام هذا المodule في الفئة كما يلي:
#!/usr/bin/ruby $LOAD_PATH << '.' require "support" class Decade include Week no_of_yrs=10 def no_of_months puts Week::FIRST_DAY number=10*12 puts number conclusion conclusion d1=Decade.new puts Week::FIRST_DAY Week.weeks_in_month Week.weeks_in_year d1.no_of_months
سيكون هناك نتيجة كما يلي:
الأحد تملك أربعة أسابيع في الشهر تملك 52 أسبوعًا في السنة الأحد 120
قبل قراءة هذا الفصل، تحتاج إلى فهم مبدأ التوجه للأ�체ة بشكل أساسي.
عندما يمكن للفئة أن تورث خصائص الفئات المختلفة، فإن الفئة تظهر كتوريث متعدد.
روبي لا يدعم التوريث المتعدد مباشرة، ولكن مodule (Module) لروبي لديها وظيفة سحرية أخرى. إنها تقريبًا تزيل الحاجة إلى التوريث المتعدد، وتقدم ما يُدعى mixin النظام.
روبي لم يحقق حقًا ميكانيكية التوريث المتعدد، بل استخدم تقنية mixin كبديل. عند تضمين المodule في تعريف الفئة، يتم دمج طرق المodule في الفئة.
دعونا نرى الشفرة التالية كي نعرف المزيد عن mixin:
module A def a1 conclusion def a2 conclusion conclusion module B def b1 conclusion def b2 conclusion conclusion class Sample include A include B def s1 conclusion conclusion samp=Sample.new samp.a1 samp.a2 samp.b1 samp.b2 samp.s1
تتكون مكتبة A من طرق a1 و a2.
تتكون مكتبة B من طرق b1 و b2.
تتضمن فئة Sample مكتبات A و B.
يمكن لفئة Sample الوصول إلى جميع أربع الطرق، وهي a1، a2، b1 و b2.
لذلك، يمكنك رؤية أن فئة Sample ورثت من مكتبتين، يمكنك القول أن فئة Sample تستخدم التوريث المتعدد أو mixin 。