আমি মিশিনগুলি বোঝার সর্বোত্তম উপায় হ'ল ভার্চুয়াল ক্লাস। মিক্সিনগুলি হ'ল "ভার্চুয়াল ক্লাস" যা কোনও শ্রেণীর বা মডিউলের পূর্বপুরুষ চেইনে ইনজেকশন দেওয়া হয়েছিল।
আমরা যখন "অন্তর্ভুক্ত" ব্যবহার করি এবং এটি একটি মডিউল পাস করি তখন এটি পূর্বসূচী শৃঙ্খলে মডিউলটিকে ক্লাসের ঠিক আগে যোগ করে যা আমরা উত্তরাধিকার সূত্রে গ্রহণ করি:
class Parent
end
module M
end
class Child < Parent
include M
end
Child.ancestors
=> [Child, M, Parent, Object ...
রুবির প্রতিটি বস্তুর একটি সিঙ্গলটন ক্লাসও রয়েছে। এই সিঙ্গলটন শ্রেণিতে যুক্ত পদ্ধতিগুলিকে সরাসরি অবজেক্টে কল করা যেতে পারে এবং তাই তারা "শ্রেণি" পদ্ধতি হিসাবে কাজ করে। যখন আমরা কোন বস্তুর "প্রসারিত" ব্যবহার করি এবং বস্তুকে একটি মডিউল পাস করি, আমরা মডিউলের পদ্ধতিগুলি অবজেক্টের সিঙ্গলটন শ্রেণিতে যুক্ত করছি:
module M
def m
puts 'm'
end
end
class Test
end
Test.extend M
Test.m
আমরা সিঙ্গলটন_ক্লাস পদ্ধতিতে সিঙ্গলটন শ্রেণিতে অ্যাক্সেস করতে পারি:
Test.singleton_class.ancestors
=> [#<Class:Test>, M, #<Class:Object>, ...
রুবি মডিউলগুলি যখন ক্লাস / মডিউলগুলিতে মিশ্রিত করা হয় তখন তাদের জন্য কিছু হুক সরবরাহ করে। included
রুবি দ্বারা সরবরাহিত একটি হুক পদ্ধতি যা যখনই আপনি কোনও মডিউল বা ক্লাসে কোনও মডিউল অন্তর্ভুক্ত করেন তখন কল হয়। অন্তর্ভুক্ত মত, extended
প্রসারিত জন্য একটি যুক্ত হুক আছে । যখন কোনও মডিউল অন্য মডিউল বা শ্রেণি দ্বারা প্রসারিত হয় তখন ডাকা হবে।
module M
def self.included(target)
puts "included into #{target}"
end
def self.extended(target)
puts "extended into #{target}"
end
end
class MyClass
include M
end
class MyClass2
extend M
end
এটি এমন একটি আকর্ষণীয় প্যাটার্ন তৈরি করে যা বিকাশকারীরা ব্যবহার করতে পারেন:
module M
def self.included(target)
target.send(:include, InstanceMethods)
target.extend ClassMethods
target.class_eval do
a_class_method
end
end
module InstanceMethods
def an_instance_method
end
end
module ClassMethods
def a_class_method
puts "a_class_method called"
end
end
end
class MyClass
include M
# a_class_method called
end
আপনি দেখতে পাচ্ছেন যে, এই একক মডিউলটি উদাহরণ পদ্ধতিগুলি, "শ্রেণি" পদ্ধতিগুলি যুক্ত করছে এবং লক্ষ্য ক্লাসে সরাসরি অভিনয় করছে (এক্ষেত্রে a_class_method () কল করা)।
অ্যাক্টিভসপোর্ট :: উদ্বেগ এই প্যাটার্নটি encapsulates। অ্যাক্টিভসপোর্ট: কনসার্ন ব্যবহার করার জন্য এখানে একই মডিউলটি আবারও লেখা হয়েছে:
module M
extend ActiveSupport::Concern
included do
a_class_method
end
def an_instance_method
end
module ClassMethods
def a_class_method
puts "a_class_method called"
end
end
end