লুয়া (Lua) ভাষায় মেটামেথডস (Metamethods) হল বিশেষ ফাংশন যা টেবিল (tables) বা অন্যান্য ডেটা স্ট্রাকচারকে কাস্টমাইজড আচরণ প্রদান করতে ব্যবহৃত হয়। মেটামেথডগুলোর মাধ্যমে আপনি কিভাবে টেবিলের সদস্য অ্যাক্সেস বা পরিবর্তন হবে, কিভাবে একটি অবজেক্টকে কল করা যাবে, এবং অন্যান্য আচার-আচরণ নিয়ন্ত্রণ করতে পারেন। মেটামেথড গুলি সাধারণত একটি মেটাটেবিল (metatable) এর মধ্যে সংরক্ষিত থাকে, এবং সেই মেটাটেবিলকে টেবিলের সাথে অ্যাসোসিয়েট করা হয়।
এই টিউটোরিয়ালে আমরা কিছু সাধারণ মেটামেথড যেমন __index, __newindex, __call, __add ইত্যাদির ব্যবহার এবং উদাহরণ দেখব।
১. __index মেটামেথড
__index মেটামেথডটি ব্যবহৃত হয় যখন আপনি একটি টেবিলের এমন কোন সদস্য অ্যাক্সেস করেন যা সেখানে উপস্থিত নেই। এটি একটি টেবিলের সদস্যের জন্য একটি ডিফল্ট মান বা কাস্টম আচরণ প্রদান করে।
উদাহরণ:
person = {name = "John", age = 30}
-- মেটাটেবিল তৈরি
mt = {
__index = function(table, key)
if key == "city" then
return "New York" -- ডিফল্ট মান প্রদান
else
return nil -- অন্য কোনো কিপর্যায়ে nil ফেরত
end
end
}
-- person টেবিলের সাথে মেটাটেবিল অ্যাসোসিয়েট করা
setmetatable(person, mt)
print(person.name) -- আউটপুট: John
print(person.city) -- আউটপুট: New York
print(person.country) -- আউটপুট: nilএখানে, person টেবিলের মধ্যে city কীগুলি নেই, তবে __index মেটামেথডের মাধ্যমে কাস্টম মান "New York" রিটার্ন করা হয়েছে।
২. __newindex মেটামেথড
__newindex মেটামেথডটি ব্যবহৃত হয় যখন আপনি একটি টেবিলের নতুন সদস্য সেট (assign) করার চেষ্টা করেন। এটি একটি কাস্টম আচরণ প্রদান করে, যেমন একটি নির্দিষ্ট কিপর্যায়ে একটি ভ্যালু প্রিভেন্ট (প্রতিরোধ) করা।
উদাহরণ:
person = {name = "John", age = 30}
-- মেটাটেবিল তৈরি
mt = {
__newindex = function(table, key, value)
if key == "age" and value < 18 then
print("Age must be at least 18.")
else
rawset(table, key, value) -- স্বাভাবিকভাবে মান সেট করা
end
end
}
setmetatable(person, mt)
person.age = 17 -- আউটপুট: Age must be at least 18.
person.age = 25 -- এটা সফলভাবে age কে 25 সেট করবে
print(person.age) -- আউটপুট: 25এখানে, age এর জন্য __newindex ব্যবহার করা হয়েছে যাতে যেকোনো বয়স ১৮ এর কম হলে সেট করা না যায়।
৩. __call মেটামেথড
__call মেটামেথডটি ব্যবহৃত হয় যখন আপনি একটি টেবিলকে একটি ফাংশনের মতো কল করতে চান। এটি টেবিলকে একটি ফাংশনে রূপান্তরিত করে এবং সেই টেবিলের মধ্যে কাস্টম আচরণ চালাতে সক্ষম হয়।
উদাহরণ:
person = {
name = "John",
age = 30,
__call = function(self)
print("Calling " .. self.name .. " who is " .. self.age .. " years old.")
end
}
setmetatable(person, person)
person() -- আউটপুট: Calling John who is 30 years old.এখানে, person টেবিলকে একটি ফাংশন হিসেবে কল করা হয়েছে এবং __call মেটামেথডের মাধ্যমে কাস্টম আচরণ সম্পাদিত হয়েছে।
৪. __add মেটামেথড
__add মেটামেথডটি ব্যবহৃত হয় যখন আপনি দুটি টেবিল বা সংখ্যা যোগ করার চেষ্টা করেন। এটি টেবিল বা অন্য ডেটা টাইপের মধ্যে কাস্টম যোগফল নির্ধারণ করতে ব্যবহৃত হয়।
উদাহরণ:
point1 = {x = 1, y = 2}
point2 = {x = 3, y = 4}
-- মেটাটেবিল তৈরি
mt = {
__add = function(p1, p2)
return {x = p1.x + p2.x, y = p1.y + p2.y}
end
}
setmetatable(point1, mt)
setmetatable(point2, mt)
-- দুইটি পয়েন্ট যোগ করা
result = point1 + point2
print(result.x) -- আউটপুট: 4
print(result.y) -- আউটপুট: 6এখানে, point1 এবং point2 এর মধ্যে __add মেটামেথড ব্যবহার করে দুটি পয়েন্টের যোগফল বের করা হয়েছে।
৫. অন্যান্য মেটামেথড
লুয়া ভাষায় আরও অনেক মেটামেথড রয়েছে, যেমন:
__tostring: এটি টেবিলের একটি কাস্টম স্ট্রিং রিপ্রেজেন্টেশন তৈরি করে।__mul: এটি টেবিলের জন্য কাস্টম গুণফল নির্ধারণ করতে ব্যবহৃত হয়।__sub: এটি টেবিলের জন্য কাস্টম বিয়োগফল নির্ধারণ করতে ব্যবহৃত হয়।__metatable: এটি টেবিলের মেটাটেবিল অ্যাক্সেসকে নিয়ন্ত্রণ করতে ব্যবহৃত হয়।
সারসংক্ষেপ
লুয়া ভাষায় মেটামেথড একটি শক্তিশালী ফিচার যা টেবিলের আচরণ কাস্টমাইজ করতে সহায়তা করে। আপনি __index, __newindex, __call, __add এবং অন্যান্য মেটামেথড ব্যবহার করে টেবিলের আচরণ নিয়ন্ত্রণ করতে পারেন এবং একটি টেবিলকে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) স্টাইলে ব্যবহার করতে পারেন। মেটামেথড ব্যবহার করে আপনি টেবিলের উপর বিভিন্ন কাস্টম কার্যক্রম এবং অপারেশন নির্ধারণ করতে পারেন।
Read more