লুয়া (Lua) প্রোগ্রামিং ভাষায় টেবিল (Tables) হলো একমাত্র ডেটা স্ট্রাকচার, যা অ্যারে, ম্যাপ, এবং অবজেক্টের মতো কাজ করতে পারে। এটি একটি খুবই গুরুত্বপূর্ণ এবং শক্তিশালী ডেটা স্ট্রাকচার, যা ডেটা সংগঠিত এবং সংরক্ষণ করার জন্য ব্যবহৃত হয়। লুয়া ভাষায় টেবিল মূলত কীবোর্ড এবং মান (key-value) জোড়া হিসেবে কাজ করে, তবে এটি অন্যান্য ডেটা স্ট্রাকচারের মতোও কাজ করতে পারে।
১. টেবিল ডিফাইন করা (Defining a Table)
লুয়া ভাষায় একটি টেবিল তৈরি করতে {} ব্যবহার করা হয়। টেবিলের মধ্যে ডেটা সংরক্ষণ করতে আমরা কীবোর্ড এবং মান (key-value) পেয়ার ব্যবহার করি।
সিনট্যাক্স:
table_name = {key1 = value1, key2 = value2, ...}উদাহরণ:
person = {name = "John", age = 30}
print(person.name) -- আউটপুট: John
print(person.age) -- আউটপুট: 30এখানে, person টেবিলের মধ্যে দুটি কীবোর্ড (name, age) এবং তাদের মান ("John", 30) রাখা হয়েছে।
২. অ্যারে (Arrays) হিসেবে টেবিল ব্যবহার
টেবিলকে অ্যারে হিসেবেও ব্যবহার করা যায়, যেখানে ইনডেক্স (index) সংখ্যা হিসেবে থাকে। ইনডেক্সগুলো সাধারণত এক থেকে শুরু হয়, তবে লুয়া কোনো নির্দিষ্ট ইনডেক্স অনুসরণ করে না, আপনি নিজেই ইনডেক্স নির্ধারণ করতে পারেন।
উদাহরণ:
fruits = {"Apple", "Banana", "Cherry"}
print(fruits[1]) -- আউটপুট: Apple
print(fruits[2]) -- আউটপুট: Bananaএখানে, fruits একটি টেবিল যার ইনডেক্স দিয়ে ডেটা অ্যাক্সেস করা হয়েছে।
৩. টেবিলের মধ্যে ফাংশন রাখা (Storing Functions in Tables)
লুয়া ভাষায় ফাংশনও টেবিলের মধ্যে রাখা যেতে পারে, যা আমাদের কাস্টম অবজেক্টের মতো কাজ করতে সহায়তা করে।
উদাহরণ:
person = {
name = "Alice",
greet = function()
print("Hello, " .. person.name)
end
}
person.greet() -- আউটপুট: Hello, Aliceএখানে, greet ফাংশনটিকে person টেবিলের একটি মেম্বার হিসেবে রাখা হয়েছে এবং এটি person.name অ্যাক্সেস করতে পারছে।
৪. টেবিলের মধ্যে টেবিল রাখা (Nested Tables)
লুয়া ভাষায় টেবিলের মধ্যে অন্য টেবিলও রাখা যেতে পারে, যা নেস্টেড টেবিল (nested tables) হিসেবে পরিচিত। এটি ডেটা হায়ারার্কি বা সম্পর্কিত ডেটা সংগঠিত করতে সহায়তা করে।
উদাহরণ:
address = {
street = "123 Main St",
city = "Somewhere",
country = "Countryland"
}
person = {
name = "John",
age = 30,
address = address -- নেস্টেড টেবিল
}
print(person.address.street) -- আউটপুট: 123 Main Stএখানে, person টেবিলের মধ্যে address নামে আরেকটি টেবিল রাখা হয়েছে।
৫. টেবিল মেথড (Table Methods)
লুয়া ভাষায় টেবিলের সাথে কাজ করার জন্য কিছু বিল্ট-ইন মেথড রয়েছে, যেমন table.insert, table.remove, table.sort ইত্যাদি। এগুলি টেবিলের ডেটা ম্যানিপুলেশন করতে ব্যবহৃত হয়।
উদাহরণ:
- table.insert: টেবিলের শেষে নতুন উপাদান যোগ করে।
- table.remove: টেবিল থেকে একটি উপাদান সরিয়ে দেয়।
fruits = {"Apple", "Banana", "Cherry"}
-- টেবিলের শেষে নতুন উপাদান যোগ করা
table.insert(fruits, "Orange")
print(fruits[4]) -- আউটপুট: Orange
-- টেবিল থেকে একটি উপাদান সরানো
table.remove(fruits, 2)
print(fruits[2]) -- আউটপুট: Cherryএখানে, table.insert এবং table.remove মেথডগুলো ব্যবহার করা হয়েছে টেবিলের উপাদান যোগ এবং মুছে ফেলার জন্য।
৬. টেবিলের উপর লুপ (Looping through Tables)
টেবিলের উপাদানগুলোর উপর লুপ চালানো যেতে পারে। সাধারণত pairs বা ipairs ফাংশন ব্যবহার করে টেবিলের উপাদানগুলো একে একে অ্যাক্সেস করা হয়।
ipairs ব্যবহার (যখন ইনডেক্সগুলো ধারাবাহিক হয়):
fruits = {"Apple", "Banana", "Cherry"}
for i, fruit in ipairs(fruits) do
print(i, fruit)
endএখানে ipairs ব্যবহার করে টেবিলের ইনডেক্স ভিত্তিক লুপ করা হয়েছে। আউটপুট হবে:
1 Apple
2 Banana
3 Cherrypairs ব্যবহার (যখন টেবিলের কীগুলো যেকোনো ধরনের হয়):
person = {name = "John", age = 30}
for key, value in pairs(person) do
print(key, value)
endএখানে pairs ব্যবহার করা হয়েছে, যেটি কীবোর্ড-ভিত্তিক লুপ চালায়। আউটপুট হবে:
name John
age 30৭. টেবিলের কিছু বিল্ট-ইন ফাংশন
লুয়া টেবিলের জন্য কিছু বিল্ট-ইন ফাংশন সরবরাহ করে:
- table.concat: একটি টেবিলের উপাদানগুলোকে একত্রিত করে একটি স্ট্রিং বানায়।
- table.maxn: টেবিলের মধ্যে সর্বোচ্চ ইনডেক্স রিটার্ন করে।
উদাহরণ:
fruits = {"Apple", "Banana", "Cherry"}
-- টেবিলের উপাদানগুলোকে একত্রিত করা
print(table.concat(fruits, ", ")) -- আউটপুট: Apple, Banana, Cherryসারসংক্ষেপ
টেবিল (Tables) লুয়া ভাষায় একমাত্র ডেটা স্ট্রাকচার যা অ্যারে, ম্যাপ এবং অবজেক্টের মতো কাজ করতে সক্ষম। এটি ডেটা সঞ্চয় এবং সংগঠিত করার জন্য ব্যবহৃত হয়। লুয়া টেবিলের মাধ্যমে ডেটা রাখার পাশাপাশি ফাংশন এবং নেস্টেড টেবিলও ব্যবহার করা যায়। টেবিলের সাথে কাজ করার জন্য লুয়া কিছু শক্তিশালী মেথড যেমন table.insert, table.remove, table.sort সরবরাহ করে।
লুয়া (Lua) ভাষার একমাত্র ডেটা স্ট্রাকচার হল **টেবিল (Table)**। এটি অ্যারে, ম্যাপ, এবং অবজেক্টের মতো কাজ করতে পারে এবং লুয়া ভাষায় ডেটা সংগঠিত ও সংরক্ষণের জন্য প্রধান মাধ্যম। টেবিল ব্যবহার করে আমরা এক বা একাধিক মানকে একটি ডেটা স্ট্রাকচার হিসেবে ধারণ করতে পারি।
টেবিল (Table) এর ধারণা
- টেবিল হল লুয়া ভাষায় ডেটা স্ট্রাকচার যা কন্টেইনারের মতো কাজ করে।
- এটি স্নেহপূর্ণভাবে মান এবং কী (key) দ্বারা তৈরি একটি ডেটা স্ট্রাকচার।
- টেবিলের মধ্যে কোন ধরনের ডেটা থাকতে পারে, যেমন: নাম্বার, স্ট্রিং, বুলিয়ান, অন্যান্য টেবিল বা ফাংশন।
- একটি টেবিলের মান অ্যাক্সেস করা হয় কী (key) দ্বারা, তবে এটি অ্যারে (array) হিসেবেও কাজ করতে পারে।
টেবিল তৈরি করা (Creating Tables)
সাধারণ টেবিল (Simple Table)
লুয়া ভাষায় টেবিল তৈরি করার জন্য {} ব্রেসেস ব্যবহার করা হয়।
উদাহরণ:
person = {} -- একটি খালি টেবিল তৈরি করাএখানে, person একটি খালি টেবিল তৈরি করা হয়েছে, কিন্তু এতে কোন মান বা কী অন্তর্ভুক্ত নেই।
টেবিলের মধ্যে ডেটা যুক্ত করা
টেবিলের মধ্যে মান (value) অ্যাসাইন করতে হবে একটি কী (key) ব্যবহার করে।
উদাহরণ:
person = {
name = "Alice", -- কী 'name' এর সাথে মান 'Alice' অ্যাসাইন করা হয়েছে
age = 30 -- কী 'age' এর সাথে মান 30 অ্যাসাইন করা হয়েছে
}এখানে, person টেবিলটি দুটি কী-মান পেয়ার ধারণ করছে:
nameকী এর মান"Alice"ageকী এর মান30
অ্যারে টাইপ টেবিল তৈরি করা
টেবিলকে অ্যারে হিসেবে ব্যবহার করতে হলে আপনি সাধারণত ধারাবাহিক সংখ্যা (1, 2, 3, ...) কী হিসেবে ব্যবহার করতে পারেন। এটি একটি সিম্পল অ্যারে তৈরির উপায়।
উদাহরণ:
fruits = {"Apple", "Banana", "Cherry"} -- একটি অ্যারে টেবিল তৈরি করা
print(fruits[1]) -- আউটপুট: Appleএখানে, fruits টেবিলটি একটি অ্যারে হিসেবে কাজ করছে, যেখানে ৩টি ফলের নাম রয়েছে। অ্যারে-এর প্রথম মান fruits[1] দ্বারা অ্যাক্সেস করা হয়েছে।
মিশ্র ডেটা টাইপের টেবিল (Mixed Data Types Table)
লুয়া টেবিল একসাথে বিভিন্ন ধরনের ডেটা ধারণ করতে পারে, যেমন: সংখ্যার সাথে স্ট্রিং, বুলিয়ান, এবং অন্য টেবিল।
উদাহরণ:
person = {
name = "John", -- স্ট্রিং
age = 25, -- নাম্বার
isStudent = true, -- বুলিয়ান
hobbies = {"Reading", "Swimming", "Cycling"} -- অ্যারে
}এখানে, person টেবিলটি একাধিক ডেটা টাইপ ধারণ করছে:
name: স্ট্রিং"John"age: নাম্বার25isStudent: বুলিয়ানtruehobbies: একটি অ্যারে যেটিতে ৩টি স্ট্রিং মান রয়েছে
টেবিলের মান অ্যাক্সেস করা
টেবিলের মান অ্যাক্সেস করতে আপনি কী ব্যবহার করবেন। অ্যারে ক্ষেত্রে সংখ্যাটি দিয়ে মান অ্যাক্সেস করা যায়।
উদাহরণ:
person = {
name = "Alice",
age = 30
}
print(person.name) -- আউটপুট: Alice
print(person["age"]) -- আউটপুট: 30এখানে, আপনি দুটি ভিন্ন উপায়ে টেবিলের মান অ্যাক্সেস করতে পারেন:
person.nameদ্বারাnameকী-এর মান অ্যাক্সেস করা।person["age"]দ্বারাageকী-এর মান অ্যাক্সেস করা।
টেবিলের মধ্যে ফাংশন যুক্ত করা
লুয়া টেবিলের মধ্যে ফাংশনও রাখতে পারে। এটি সাধারণত অবজেক্টের মতো আচরণ করে, যেখানে ফাংশনকে একটি মেথড হিসেবে ধারণ করা হয়।
উদাহরণ:
person = {
name = "Alice",
age = 30,
greet = function(self)
print("Hello, " .. self.name)
end
}
person:greet() -- আউটপুট: Hello, Aliceএখানে, greet একটি ফাংশন হিসেবে টেবিলের মধ্যে রাখা হয়েছে। self দ্বারা টেবিলের নিজস্ব মান অ্যাক্সেস করা হচ্ছে।
সারসংক্ষেপ
লুয়া ভাষায় টেবিল হল একটি অত্যন্ত শক্তিশালী ডেটা স্ট্রাকচার যা অ্যারে, ম্যাপ এবং অবজেক্টের মতো কাজ করতে পারে। এটি কী এবং মান (key-value pairs) এর ভিত্তিতে কাজ করে। টেবিল তৈরি করার জন্য {} ব্রেসেস ব্যবহার করা হয় এবং এর মধ্যে বিভিন্ন ধরনের ডেটা (সংখ্যা, স্ট্রিং, বুলিয়ান, ফাংশন, অন্যান্য টেবিল) সংরক্ষণ করা যেতে পারে।
- টেবিল ডিক্লারেশন:
{}দিয়ে শুরু। - টেবিলের মধ্যে ডেটা যুক্ত করা: কী এবং মান দ্বারা।
- অ্যারে তৈরি করা: ধারাবাহিক সংখ্যা কী ব্যবহার করা।
- টেবিল অ্যাক্সেস:
.অথবা[]দ্বারা।
এটি লুয়া ভাষায় ডেটা সংগঠিত করার প্রধান উপায়।
লুয়া (Lua) ভাষায় টেবিল (Table) হলো একমাত্র ডেটা স্ট্রাকচার যা বিভিন্ন ধরনের ডেটা সংরক্ষণ করতে পারে। লুয়া টেবিল দুটি প্রধান ধরনের হতে পারে: ইনডেক্সড টেবিল (Indexed Tables) এবং **অ্যাসোসিয়েটিভ টেবিল (Associative Tables)**। এই দুই ধরনের টেবিলের মধ্যে মূল পার্থক্য হলো কীভাবে মান (values) সংরক্ষিত এবং অ্যাক্সেস করা হয়।
এই টিউটোরিয়ালে আমরা ইনডেক্সড এবং অ্যাসোসিয়েটিভ টেবিল সম্পর্কে বিস্তারিত আলোচনা করব।
১. ইনডেক্সড টেবিল (Indexed Tables)
ইনডেক্সড টেবিল এমন একটি টেবিল যেখানে মানগুলো অ্যাক্সেস করা হয় ইন্টিজার ইনডেক্স বা অন্য যেকোনো সূচক ব্যবহার করে। এটি সাধারণত অ্যারে বা তালিকা (list) হিসাবে ব্যবহৃত হয়, যেখানে প্রতিটি আইটেম একটি নির্দিষ্ট পজিশন দ্বারা চিহ্নিত হয়।
উদাহরণ:
-- ইনডেক্সড টেবিল ডিফাইন করা
fruits = {"Apple", "Banana", "Orange"}
-- টেবিলের মান অ্যাক্সেস করা
print(fruits[1]) -- আউটপুট: Apple
print(fruits[2]) -- আউটপুট: Bananaএখানে, fruits একটি ইনডেক্সড টেবিল, যেখানে Apple, Banana, এবং Orange মানগুলো ইন্টিজার ইনডেক্স দ্বারা সংরক্ষিত হয়েছে (১, ২, ৩)।
ইনডেক্সড টেবিলের বৈশিষ্ট্য:
- ইনডেক্স সাধারণত ধারাবাহিকভাবে বৃদ্ধি পায় (১, ২, ৩, ...), কিন্তু আপনি এটি কাস্টম ইনডেক্স দিয়েও ব্যবহার করতে পারেন।
- ইনডেক্সড টেবিল মূলত অ্যারে বা সিকোয়েন্সের মতো ব্যবহার করা হয়, যেখানে আইটেমের সংখ্যা এবং ক্রম খুবই গুরুত্বপূর্ণ।
২. অ্যাসোসিয়েটিভ টেবিল (Associative Tables)
অ্যাসোসিয়েটিভ টেবিল হলো এমন একটি টেবিল যেখানে মানগুলো কী-ভ্যালু পেয়ার হিসেবে সংরক্ষিত হয়। এই ধরনের টেবিলের মধ্যে কী হতে পারে যে কোনো ধরনের ডেটা (ইন্টিজার, স্ট্রিং, বুলিয়ান ইত্যাদি), এবং মান হতে পারে কোনো ডেটা টাইপ।
উদাহরণ:
-- অ্যাসোসিয়েটিভ টেবিল ডিফাইন করা
person = {name = "John", age = 30, city = "New York"}
-- টেবিলের মান অ্যাক্সেস করা
print(person.name) -- আউটপুট: John
print(person["age"]) -- আউটপুট: 30এখানে, person একটি অ্যাসোসিয়েটিভ টেবিল, যেখানে name, age, এবং city হল কী, এবং তাদের মান যথাক্রমে "John", 30, এবং "New York"।
অ্যাসোসিয়েটিভ টেবিলের বৈশিষ্ট্য:
- কী-ভ্যালু পেয়ার হিসেবে মান সংরক্ষিত হয়। কী হতে পারে কোনো স্ট্রিং, ইন্টিজার বা অন্যান্য ডেটা টাইপ।
- অ্যাসোসিয়েটিভ টেবিলের মান অ্যাক্সেস করা হয় কী ব্যবহার করে, যা যেকোনো ডেটা টাইপ হতে পারে।
৩. ইনডেক্সড এবং অ্যাসোসিয়েটিভ টেবিলের পার্থক্য
| বৈশিষ্ট্য | ইনডেক্সড টেবিল | অ্যাসোসিয়েটিভ টেবিল |
|---|---|---|
| কী (Key) | সাধারণত ইন্টিজার ইনডেক্স | যেকোনো ধরনের ডেটা (স্ট্রিং, ইন্টিজার, ইত্যাদি) |
| মান (Value) | ধারাবাহিকভাবে অ্যাক্সেস করা হয় | কী-ভ্যালু পেয়ার হিসেবে অ্যাক্সেস করা হয় |
| ব্যবহার | সাধারণত অ্যারে বা সিকোয়েন্স | ম্যাপ বা অবজেক্ট হিসেবেও ব্যবহার করা হয় |
৪. টেবিলের অন্যান্য বৈশিষ্ট্য
টেবিলের মান পরিবর্তন
fruits = {"Apple", "Banana", "Orange"}
-- মান পরিবর্তন
fruits[1] = "Grapes"
print(fruits[1]) -- আউটপুট: Grapesএখানে, fruits[1] এর মান পরিবর্তন করা হয়েছে, এবং এখন এটি "Grapes"।
নতুন মান যোগ করা
person = {name = "Alice", age = 25}
-- নতুন মান যোগ করা
person.city = "Paris"
print(person.city) -- আউটপুট: Parisএখানে, person টেবিলে নতুন কী-ভ্যালু পেয়ার city = "Paris" যোগ করা হয়েছে।
সারসংক্ষেপ
লুয়া ভাষায় টেবিল একটি খুবই শক্তিশালী ডেটা স্ট্রাকচার, যা ইনডেক্সড টেবিল এবং অ্যাসোসিয়েটিভ টেবিল হিসেবে ব্যবহৃত হতে পারে।
- ইনডেক্সড টেবিল সাধারণত অ্যারে বা তালিকা হিসেবে ব্যবহৃত হয়, যেখানে মানগুলো ধারাবাহিকভাবে ইন্টিজার ইনডেক্স দিয়ে অ্যাক্সেস করা হয়।
- অ্যাসোসিয়েটিভ টেবিল কী-ভ্যালু পেয়ার হিসেবে ব্যবহার হয়, যেখানে কী হতে পারে যেকোনো ধরনের ডেটা এবং মান যেকোনো ডেটা টাইপ হতে পারে।
এই টেবিলগুলির মাধ্যমে লুয়া ভাষায় বিভিন্ন ধরনের ডেটা স্ট্রাকচার তৈরি করা সম্ভব, যা ডেভেলপারদের কোডের নমনীয়তা এবং কার্যকারিতা বাড়াতে সাহায্য করে।
লুয়া (Lua) ভাষায় টেবিল (table) হল একমাত্র ডেটা স্ট্রাকচার, যা অ্যারে, ম্যাপ, এবং অবজেক্ট হিসেবে কাজ করতে পারে। টেবিলের মাধ্যমে ডেটা সংরক্ষণ, ম্যানিপুলেট এবং এক্সেস করা যায়। টেবিলের ইনসার্শন (Insertion), ডিলিশন (Deletion), এবং ট্রাভার্সাল (Traversal) অত্যন্ত গুরুত্বপূর্ণ অপারেশন যা টেবিলের মধ্যে ডেটা পরিবর্তন বা অনুসন্ধান করতে ব্যবহৃত হয়।
এই টিউটোরিয়ালে, আমরা টেবিলের ইনসার্শন, ডিলিশন, এবং ট্রাভার্সাল সম্পর্কিত মৌলিক ধারণাগুলি আলোচনা করব।
১. টেবিল ইনসার্শন (Table Insertion)
লুয়া টেবিলে নতুন মান যোগ করতে, আপনি সরাসরি টেবিলের ইনডেক্স বা কিকে মান অ্যাসাইন করতে পারেন। আপনি নতুন উপাদান যোগ করতে table[index] = value সিনট্যাক্স ব্যবহার করতে পারেন।
উদাহরণ:
ইনডেক্স বা কিকে মান অ্যাসাইন করে ইনসার্শন
-- সাধারণ অ্যারে টেবিল
fruits = {"Apple", "Banana", "Orange"}
-- নতুন মান যোগ করা
table.insert(fruits, "Grapes")
-- নির্দিষ্ট ইনডেক্সে মান যোগ করা
table.insert(fruits, 2, "Mango")
-- ফলস্বরূপ টেবিল: {"Apple", "Mango", "Banana", "Orange", "Grapes"}
for i, fruit in ipairs(fruits) do
print(i, fruit)
endএখানে, প্রথম table.insert(fruits, "Grapes") ফাংশনটি টেবিলের শেষে Grapes যোগ করেছে, এবং দ্বিতীয় table.insert(fruits, 2, "Mango") ফাংশনটি ইনডেক্স ২-এ Mango যোগ করেছে।
২. টেবিল ডিলিশন (Table Deletion)
লুয়া টেবিল থেকে মান মুছে ফেলতে, আপনি table.remove() ফাংশন ব্যবহার করতে পারেন। এটি টেবিলের একটি নির্দিষ্ট ইনডেক্স থেকে মান মুছে দেয়। আপনি সরাসরি একটি ইনডেক্স ব্যবহার করে একটি কিকে মান মুছতেও পারেন।
উদাহরণ:
ইনডেক্স ব্যবহার করে ডিলিশন
-- সাধারণ অ্যারে টেবিল
fruits = {"Apple", "Banana", "Orange", "Grapes"}
-- ইনডেক্স ব্যবহার করে ডিলিট
table.remove(fruits, 2) -- ইনডেক্স ২ এর মান "Banana" মুছে ফেলবে
-- ফলস্বরূপ টেবিল: {"Apple", "Orange", "Grapes"}
for i, fruit in ipairs(fruits) do
print(i, fruit)
endএখানে, table.remove(fruits, 2) ফাংশনটি ইনডেক্স ২ (যেখানে Banana ছিল) থেকে মান মুছে ফেলেছে।
কিকে মান মুছে দেওয়া
-- সাধারণ ম্যাপ টেবিল
person = {name = "John", age = 30, city = "New York"}
-- কিকে মান মুছে দেয়া
person.age = nil -- "age" কিকের মান মুছে ফেলেছে
-- ফলস্বরূপ টেবিল: {name = "John", city = "New York"}
for key, value in pairs(person) do
print(key, value)
endএখানে, person.age = nil কিক age থেকে মান মুছে ফেলেছে।
৩. টেবিল ট্রাভার্সাল (Table Traversal)
লুয়া টেবিল ট্রাভার্সাল করতে, আপনি ipairs() বা pairs() ফাংশন ব্যবহার করতে পারেন।
ipairs()ব্যবহার করা হয় সিকোয়েন্সাল (সংখ্যা অনুসরণ করা) টেবিলের জন্য, যেখানে ইনডেক্স সিকোয়েন্স অনুসারে থাকে।pairs()ব্যবহার করা হয় যে কোনো ধরনের টেবিলের জন্য (যেমন, ম্যাপ বা অর্ডারবিহীন টেবিল), যেখানে ইনডেক্স অর্ডার করা থাকে না।
উদাহরণ:
ipairs() ব্যবহার করে ট্রাভার্সাল (সংখ্যাতীত টেবিল)
-- সাধারণ অ্যারে টেবিল
fruits = {"Apple", "Banana", "Orange"}
-- `ipairs()` দিয়ে ট্রাভার্সাল
for i, fruit in ipairs(fruits) do
print(i, fruit)
endএখানে, ipairs() ব্যবহৃত হয়েছে একটি সংখ্যাতীত টেবিলের উপাদানগুলো ট্রাভার্স করতে। আউটপুট হবে:
1 Apple
2 Banana
3 Orangepairs() ব্যবহার করে ট্রাভার্সাল (ম্যাপ বা অর্ডারবিহীন টেবিল)
-- সাধারণ ম্যাপ টেবিল
person = {name = "John", age = 30, city = "New York"}
-- `pairs()` দিয়ে ট্রাভার্সাল
for key, value in pairs(person) do
print(key, value)
endএখানে, pairs() ব্যবহার করা হয়েছে একটি ম্যাপ টেবিলের উপাদানগুলো ট্রাভার্স করতে। আউটপুট হতে পারে:
name John
age 30
city New Yorkবি.দ্র.: pairs() টেবিলের সকল কিক/ভ্যালু ট্রাভার্স করতে ব্যবহৃত হয়, এবং এটি অর্ডার গ্যারান্টি দেয় না।
সারসংক্ষেপ
লুয়া টেবিল ম্যানিপুলেশন খুবই সহজ এবং নমনীয়।
- ইনসার্শন: নতুন মান টেবিলে যোগ করতে
table.insert()ব্যবহার করা হয়। - ডিলিশন: টেবিল থেকে মান মুছতে
table.remove()বা কিকেnilঅ্যাসাইন করা হয়। - ট্রাভার্সাল: টেবিলের উপাদানগুলো ট্রাভার্স করতে
ipairs()(সংখ্যাতীত টেবিল) এবংpairs()(অর্ডারবিহীন টেবিল) ব্যবহার করা হয়।
এই অপারেশনগুলো লুয়া ভাষার টেবিল ডেটা স্ট্রাকচারের সাথে কাজ করার জন্য অপরিহার্য এবং অত্যন্ত শক্তিশালী।
লুয়া (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