লুয়া (Lua) ভাষায় মেটাটেবিল (Metatables) এবং মেটামেথড (Metamethods) খুবই শক্তিশালী কনসেপ্ট। এগুলি লুয়া ভাষার ডেটা স্ট্রাকচার (যেমন টেবিল) এর আচরণ কাস্টমাইজ করতে ব্যবহৃত হয়। মেটাটেবিল ব্যবহার করে আপনি লুয়া টেবিলগুলির উপর কাস্টম অপারেশন সম্পাদন করতে পারেন, যেমন যোগফল, তুলনা, ইত্যাদি।
মেটাটেবিল (Metatables)
মেটাটেবিল হল একটি টেবিল যা আরেকটি টেবিলের আচরণ কাস্টমাইজ করতে ব্যবহৃত হয়। এটি মূলত লুয়া ডেটা স্ট্রাকচারের জন্য অতিরিক্ত আচরণ প্রদান করতে সাহায্য করে, যেমন টেবিলের সাথে গণনা বা তুলনা অপারেশন।
মেটাটেবিলের উদাহরণ
-- একটি টেবিল তৈরি করা
t1 = {10, 20}
-- মেটাটেবিল তৈরি করা
mt = {__add = function(table1, table2)
return table1[1] + table2[1]
end}
-- মেটাটেবিল টেবিল t1 এর সাথে অ্যাসাইন করা
setmetatable(t1, mt)
t2 = {30}
-- টেবিল t1 এবং t2 এর উপর যোগফল অপারেশন করা
print(t1 + t2) -- আউটপুট: 40এখানে, t1 এবং t2 দুটি টেবিল, এবং mt একটি মেটাটেবিল যা __add মেটামেথডটি সংজ্ঞায়িত করে। এই মেটামেথডটি দুইটি টেবিল যোগ করার জন্য ব্যবহৃত হচ্ছে, যেখানে প্রথম টেবিলের প্রথম মান এবং দ্বিতীয় টেবিলের প্রথম মান যোগ করা হয়।
মেটামেথড (Metamethods)
মেটামেথড হল মেটাটেবিলের বিশেষ কী, যা লুয়া টেবিলের উপর নির্দিষ্ট অপারেশনগুলোকে কাস্টমাইজ করার জন্য ব্যবহৃত হয়। কিছু গুরুত্বপূর্ণ মেটামেথডের মধ্যে রয়েছে:
__add: দুটি টেবিলের যোগফল অপারেশন।__sub: দুটি টেবিলের বিয়োগ অপারেশন।__mul: দুটি টেবিলের গুণফল অপারেশন।__div: দুটি টেবিলের ভাগফল অপারেশন।__eq: দুটি টেবিলের সমতা যাচাই।__lt: তুলনা অপারেশন (কম বা সমান)।__le: তুলনা অপারেশন (ছোট)।
মেটামেথডের উদাহরণ
-- একটি টেবিল তৈরি করা
t1 = {10, 20}
-- মেটাটেবিল তৈরি করা
mt = {
__add = function(table1, table2)
return {table1[1] + table2[1]} -- যোগফল
end,
__eq = function(table1, table2)
return table1[1] == table2[1] -- সমতা যাচাই
end
}
-- মেটাটেবিল টেবিল t1 এর সাথে অ্যাসাইন করা
setmetatable(t1, mt)
t2 = {20}
t3 = {20}
-- যোগফল এবং সমতা যাচাই
print(t1 + t2) -- আউটপুট: 30 (যোগফল)
print(t2 == t3) -- আউটপুট: true (সমতা)এখানে, __add মেটামেথড দুটি টেবিলের যোগফল করে এবং __eq মেটামেথড দুটি টেবিলের মধ্যে সমতা যাচাই করে।
আরও কিছু সাধারণ মেটামেথড
__index: যখন একটি টেবিলের মধ্যে কোনো ইনডেক্স পাওয়া যায় না, তখন এই মেটামেথডটি কল হয়।__newindex: যখন একটি নতুন ইনডেক্স একটি টেবিলের মধ্যে অ্যাসাইন করা হয়, তখন এই মেটামেথডটি কল হয়।__call: একটি টেবিলকে ফাংশনের মতো কল করা হলে এই মেটামেথডটি কল হয়।
__index এবং __newindex মেটামেথড উদাহরণ
-- একটি টেবিল তৈরি করা
person = {name = "John"}
-- মেটাটেবিল তৈরি করা
mt = {
__index = function(table, key)
if key == "age" then
return 30 -- age প্যারামিটার না থাকলে ডিফল্ট মান ৩০ প্রদান করা হবে
else
return nil
end
end,
__newindex = function(table, key, value)
if key == "age" then
print("Cannot modify age!")
else
rawset(table, key, value) -- অন্যান্য ইনডেক্স পরিবর্তন করা
end
end
}
-- মেটাটেবিল টেবিল person এর সাথে অ্যাসাইন করা
setmetatable(person, mt)
-- অ্যাক্সেস ও অ্যাসাইন
print(person.name) -- আউটপুট: John
print(person.age) -- আউটপুট: 30
person.age = 40 -- Cannot modify age!
person.city = "NY" -- city প্যারামিটার পরিবর্তন করা হবে
print(person.city) -- আউটপুট: NYএখানে, __index মেটামেথড age প্যারামিটারটি না পাওয়া গেলে ডিফল্ট মান প্রদান করে এবং __newindex মেটামেথড age প্যারামিটার পরিবর্তন হতে বাধা দেয়।
সারসংক্ষেপ
লুয়া ভাষায় মেটাটেবিল এবং মেটামেথড ব্যবহার করে আপনি টেবিলের আচরণ কাস্টমাইজ করতে পারেন। এটি আপনাকে:
- টেবিলগুলির উপর গণনা, তুলনা, এবং অন্যান্য অপারেশন কাস্টমাইজ করতে সাহায্য করে।
- বিভিন্ন ধরনের মেটামেথড ব্যবহার করে টেবিলের আচরণ আরও নমনীয় এবং শক্তিশালী করতে পারে।
লুয়া ভাষায় মেটাটেবিল এবং মেটামেথড অত্যন্ত শক্তিশালী টুল, যা আপনার কোডকে আরও অত্যাধুনিক এবং কাস্টমাইজেবল করতে সহায়তা করবে।
Read more