লুয়া ভাষায় অপারেটর ওভারলোডিং (Operator Overloading) এবং মেটামেথডস (Metamethods) ব্যবহার করে আপনি কাস্টম ডেটা টাইপের জন্য অপারেটর গুলি কাস্টমাইজ করতে পারেন। লুয়া ভাষায় মেটামেথডস হল বিশেষ ফাংশন যা টেবিলের জন্য নির্দিষ্ট অপারেশন পরিচালনা করতে ব্যবহৃত হয়। মেটামেথডসের মাধ্যমে আপনি অপারেটরের আচরণ নির্ধারণ করতে পারেন।
লুয়া ভাষায় অপারেটর ওভারলোডিং সরাসরি সমর্থিত না হলেও, মেটামেথডসের মাধ্যমে আপনি এটি সম্ভব করতে পারেন। এখানে, আমরা মেটামেথডস ব্যবহার করে অপারেটর ওভারলোডিংয়ের ধারণা এবং উদাহরণ দেখব।
১. মেটামেথডস (Metamethods) কী?
মেটামেথডস হল লুয়া টেবিলের জন্য নির্দিষ্ট ফাংশন যেগুলি একটি টেবিলের ওপর বিভিন্ন অপারেশন বাস্তবায়ন করে। এগুলি সাধারণত টেবিলের সাথে যুক্ত থাকে এবং কিছু বিশেষ শর্তে (যেমন, যোগফল, বিয়োগফল) অটোমেটিকভাবে কল হয়। মেটামেথডস কাস্টম ডেটা টাইপের জন্য অপারেটরের আচরণ কাস্টমাইজ করতে ব্যবহৃত হয়।
লুয়া ভাষায় কিছু জনপ্রিয় মেটামেথডস:
__add:+অপারেটর__sub:-অপারেটর__mul:*অপারেটর__div:/অপারেটর__mod:%অপারেটর__tostring: টেবিলকে স্ট্রিং এ রূপান্তর
২. অপারেটর ওভারলোডিং এর জন্য মেটামেথডস ব্যবহার
লুয়া টেবিলের জন্য কাস্টম অপারেটর তৈরি করতে, আমরা একটি টেবিলের মেটামেথডস ব্যবহার করি। এই মেটামেথডটি সেই টেবিলের ওপর অপারেশন চালানো হলে কল হবে।
উদাহরণ:
ধরা যাক, আমরা একটি কাস্টম টাইপ Vector তৈরি করব এবং এই Vector টাইপের জন্য + এবং - অপারেটর গুলি কাস্টমাইজ করব।
-- কাস্টম টেবিল 'Vector' তৈরি
Vector = {}
Vector.__index = Vector
-- Vector এর কনস্ট্রাকটর
function Vector.new(x, y)
local self = setmetatable({}, Vector)
self.x = x
self.y = y
return self
end
-- __add মেটামেথড ব্যবহার করে '+' অপারেটর কাস্টমাইজ করা
function Vector.__add(v1, v2)
return Vector.new(v1.x + v2.x, v1.y + v2.y)
end
-- __sub মেটামেথড ব্যবহার করে '-' অপারেটর কাস্টমাইজ করা
function Vector.__sub(v1, v2)
return Vector.new(v1.x - v2.x, v1.y - v2.y)
end
-- __tostring মেটামেথড ব্যবহার করে স্ট্রিং রূপান্তর
function Vector.__tostring(v)
return "(" .. v.x .. ", " .. v.y .. ")"
end
-- টেস্ট কোড
v1 = Vector.new(1, 2)
v2 = Vector.new(3, 4)
v3 = v1 + v2 -- __add মেটামেথড কল হবে
print(v3) -- আউটপুট: (4, 6)
v4 = v1 - v2 -- __sub মেটামেথড কল হবে
print(v4) -- আউটপুট: (-2, -2)এখানে:
Vector.__add:+অপারেটরের জন্য কাস্টম মেটামেথড, যা দুটিVectorঅবজেক্টের মান যোগ করে নতুন একটিVectorতৈরি করবে।Vector.__sub:-অপারেটরের জন্য কাস্টম মেটামেথড, যা দুটিVectorঅবজেক্টের মান বিয়োগ করে নতুন একটিVectorতৈরি করবে।Vector.__tostring: এই মেটামেথড স্ট্রিং রূপেVectorঅবজেক্টের মান প্রদর্শন করতে ব্যবহৃত হয়।
৩. অন্য মেটামেথডস এবং তাদের ব্যবহার
লুয়া ভাষায় অন্যান্য মেটামেথডস যেমন __mul, __div, __mod, এবং __eq (ইকুয়ালিটি চেক) ইত্যাদি রয়েছে, যেগুলিকে কাস্টম অপারেশনসের জন্য ব্যবহৃত হতে পারে।
উদাহরণ: __mul (গুণফল অপারেটর)
function Vector.__mul(v1, scalar)
return Vector.new(v1.x * scalar, v1.y * scalar)
end
v5 = v1 * 2 -- __mul মেটামেথড কল হবে
print(v5) -- আউটপুট: (2, 4)এখানে, __mul মেটামেথডটি ব্যবহার করে একটি Vector অবজেক্টকে একটি স্কেলার মানের (যেমন 2) সাথে গুণ করা হচ্ছে।
উদাহরণ: __eq (ইকুয়ালিটি অপারেটর)
function Vector.__eq(v1, v2)
return v1.x == v2.x and v1.y == v2.y
end
print(v1 == v2) -- আউটপুট: falseএখানে, __eq মেটামেথডটি ব্যবহার করে দুটি Vector অবজেক্টের সমতা পরীক্ষা করা হচ্ছে।
৪. মেটামেথডস এবং মেটাটেবিল (Metatables)
লুয়া ভাষায় মেটামেথডস একটি টেবিলের সাথে যুক্ত থাকে মেটাটেবিল (Metatable) এর মাধ্যমে। যখন একটি টেবিলের উপর কোনো অপারেশন করা হয়, মেটাটেবিলটি সেই অপারেশনটি পরিচালনা করবে।
local v1 = Vector.new(1, 2)
local v2 = Vector.new(3, 4)
-- মেটাটেবিল সেট করা
setmetatable(v1, Vector)
setmetatable(v2, Vector)
-- এইভাবে মেটাটেবিলের মাধ্যমে মেটামেথডস কল করা হয়।এখানে, setmetatable ফাংশনটি v1 এবং v2 টেবিলগুলিতে মেটাটেবিল সেট করে, যা মেটামেথডগুলি কার্যকর করতে সহায়তা করে।
সারসংক্ষেপ
- মেটামেথডস হল লুয়া টেবিলের জন্য বিশেষ ফাংশন যা অপারেটরের আচরণ কাস্টমাইজ করে।
- অপারেটর ওভারলোডিং: মেটামেথডস যেমন
__add,__sub,__mul,__divইত্যাদি ব্যবহার করে আপনি কাস্টম অপারেটর তৈরি করতে পারেন। - মেটাটেবিল: মেটামেথডস টেবিলের সাথে যুক্ত থাকে মেটাটেবিলের মাধ্যমে, এবং এটি টেবিলের উপর অপারেশন পরিচালনা করে।
এই কৌশলটি লুয়া ভাষায় কাস্টম ডেটা টাইপ তৈরি ও অপারেটর কাস্টমাইজ করতে সাহায্য করে, যা কোডের পুনঃব্যবহারযোগ্যতা এবং পরিষ্কারতা বাড়ায়।
Read more