এখানে পুরো গল্পটি দেওয়া হয়েছে, কেন রুবিতে মডিউল অন্তর্ভুক্তি সেভাবে কাজ করে তা বোঝার জন্য প্রয়োজনীয় প্রয়োজনীয় রূপক ধারণাগুলি ব্যাখ্যা করে।
একটি মডিউল অন্তর্ভুক্ত করা হয় যখন কি ঘটে?
ক্লাসে একটি মডিউল অন্তর্ভুক্ত করা ক্লাসের পূর্বপুরুষদের সাথে মডিউল যুক্ত করে । আপনি যে কোনও ক্লাস বা মডিউলটির পূর্বপুরুষদের ancestors
পদ্ধতিটি কল করে দেখতে পারেন :
module M
def foo; "foo"; end
end
class C
include M
def bar; "bar"; end
end
C.ancestors
যখন আপনি কোনও উদাহরণটিতে কোনও কল করেন C
, রুবি প্রদত্ত নামের সাথে একটি উদাহরণ পদ্ধতি সন্ধানের জন্য এই পূর্বপুরুষের তালিকার প্রতিটি আইটেমটি দেখবেন । যেহেতু আমরা অন্তর্ভুক্ত M
মধ্যে C
, M
এখন পূর্বপুরুষ C
, তাই যখন আমরা কলfoo
এর একটি দৃষ্টান্ত উপর C
, রুবি যে পদ্ধতি পাবেন M
:
C.new.foo
নোট করুন যে অন্তর্ভুক্তি ক্লাসে কোনও উদাহরণ বা শ্রেণীর পদ্ধতি অনুলিপি করে না - এটি ক্লাসে কেবল একটি "নোট" যুক্ত করে যে এটি অন্তর্ভুক্ত মডিউলটিতে উদাহরণ পদ্ধতিগুলিও সন্ধান করা উচিত।
আমাদের মডিউল "শ্রেণি" পদ্ধতি সম্পর্কে কি?
কারণ অন্তর্ভুক্তি কেবলমাত্র ক্লাসে মডিউল সহ উদাহরণের পদ্ধতিগুলি প্রেরণের পদ্ধতি পরিবর্তিত করে কেবল তার ক্লাসে তার উদাহরণ পদ্ধতিগুলি উপলব্ধ করে। মডিউলটিতে "শ্রেণি" পদ্ধতি এবং অন্যান্য ঘোষণাগুলি স্বয়ংক্রিয়ভাবে শ্রেণিতে অনুলিপি করা হয় না:
module M
def instance_method
"foo"
end
def self.class_method
"bar"
end
end
class C
include M
end
M.class_method
C.new.instance_method
C.class_method
রুবি কীভাবে শ্রেণিবদ্ধ পদ্ধতি প্রয়োগ করে?
রুবিতে, ক্লাস এবং মডিউলগুলি সরল বস্তু - সেগুলি শ্রেণীর উদাহরণ Class
এবং Module
। এর অর্থ হ'ল আপনি গতিশীলভাবে নতুন ক্লাস তৈরি করতে পারবেন, ভেরিয়েবল ইত্যাদি নির্ধারণ করুন assign
klass = Class.new do
def foo
"foo"
end
end
klass.new.foo
এছাড়াও রুবিতে, আপনার কাছে বস্তুগুলিতে তথাকথিত সিঙ্গলটন পদ্ধতি সংজ্ঞায়নের সম্ভাবনা রয়েছে । এই পদ্ধতিগুলি বস্তুর বিশেষ, লুকানো সিঙ্গলটন শ্রেণিতে নতুন উদাহরণ পদ্ধতি হিসাবে যুক্ত হয় :
obj = Object.new
def obj.foo
"foo"
end
obj.singleton_class.instance_methods(false)
তবে কি ক্লাস এবং মডিউলগুলি কেবল প্লেইন অবজেক্টগুলিও নয়? আসলে তারা! তার মানে কি তারা সিঙ্গলটন পদ্ধতিও থাকতে পারে? হ্যাঁ এটা করে! এবং এভাবেই শ্রেণিবদ্ধের জন্ম হয়:
class Abc
end
def Abc.foo
"foo"
end
Abc.singleton_class.instance_methods(false)
বা, শ্রেণি পদ্ধতি সংজ্ঞায়নের আরও সাধারণ উপায় হচ্ছে self
শ্রেণি সংজ্ঞা ব্লকের মধ্যে ব্যবহার করা, যা শ্রেণি অবজেক্টটি তৈরি হচ্ছে তা বোঝায়:
class Abc
def self.foo
"foo"
end
end
Abc.singleton_class.instance_methods(false)
আমি একটি মডিউলে শ্রেণিক পদ্ধতিগুলি কীভাবে অন্তর্ভুক্ত করব?
যেমনটি আমরা প্রতিষ্ঠিত করেছি, শ্রেণি পদ্ধতিগুলি ক্লাস অবজেক্টের সিঙ্গলটন শ্রেণিতে সত্যই কেবল উদাহরণ পদ্ধতি instance এর অর্থ কি এই যে আমরা ক্লাস পদ্ধতিগুলির একগুচ্ছ যোগ করার জন্য কেবল একটি মডেলকে সিঙ্গলটন শ্রেণিতে অন্তর্ভুক্ত করতে পারি ? হ্যাঁ এটা করে!
module M
def new_instance_method; "hi"; end
module ClassMethods
def new_class_method; "hello"; end
end
end
class HostKlass
include M
self.singleton_class.include M::ClassMethods
end
HostKlass.new_class_method
এই self.singleton_class.include M::ClassMethods
লাইনটি খুব সুন্দর দেখাচ্ছে না, তাই রুবি যুক্ত করেছে Object#extend
, যা একই কাজ করে - যেমন বস্তুর একক শ্রেণিতে একটি মডিউল অন্তর্ভুক্ত করে:
class HostKlass
include M
extend M::ClassMethods
end
HostKlass.singleton_class.included_modules
চলন্ত extend
কলটি মডিউলে
এই পূর্ববর্তী উদাহরণটি দুটি কারণে সুসংগঠিত কোড নয়:
- আমাদের এখন এবং উভয়কে কল করতে হবে
include
extend
HostClass
সংজ্ঞা আমাদের মডিউল সঠিকভাবে অন্তর্ভুক্ত জন্য। যদি আপনাকে অনেক অনুরূপ মডিউল অন্তর্ভুক্ত করতে হয় তবে এটি খুব জটিল হয়ে উঠতে পারে।
HostClass
সরাসরি রেফারেন্স M::ClassMethods
, যা একটি হল বাস্তবায়ন বিস্তারিত মডিউলের M
যে HostClass
চেনেন বা যত্নের প্রয়োজন করা উচিত নয়।
সুতরাং এটি সম্পর্কে কীভাবে: আমরা যখন include
প্রথম লাইনে কল করি তখন আমরা কোনওভাবে মডিউলটি অন্তর্ভুক্ত করে তা অবহিত করি এবং এটি আমাদের ক্লাস অবজেক্টটিও দেই, যাতে এটি কল করতে পারেextend
নিজে পারে। এইভাবে, মডিউলটির কাজটি চাইলে শ্রেণিক পদ্ধতিগুলি যুক্ত করা।
বিশেষ self.included
পদ্ধতিটির জন্য এটি ঠিক এটি । মডিউলটি অন্য শ্রেণিতে (বা মডিউল) অন্তর্ভুক্ত করার পরে রুবি স্বয়ংক্রিয়ভাবে এই পদ্ধতিটি কল করে এবং হোস্ট ক্লাসের অবজেক্টে প্রথম আর্গুমেন্ট হিসাবে পাস করে:
module M
def new_instance_method; "hi"; end
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def new_class_method; "hello"; end
end
end
class HostKlass
include M
def self.existing_class_method; "cool"; end
end
HostKlass.singleton_class.included_modules
অবশ্যই, ক্লাসের পদ্ধতিগুলি যুক্ত করা কেবলমাত্র আমরাই করতে পারি না self.included
। আমাদের ক্লাস অবজেক্ট রয়েছে, সুতরাং আমরা এটিতে অন্য কোনও (শ্রেণি) পদ্ধতি কল করতে পারি:
def self.included(base)
base.existing_class_method
end