Elixir-এ টাপল হলো একটি ডেটা স্ট্রাকচার, যা ডেটা সাজিয়ে রাখে এবং যেকোনো টাইপের নির্দিষ্ট সংখ্যক আইটেম ধারণ করে, তবে প্রতিটি এলিমেন্টের জন্য আলাদা কোনো নাম থাকে না। মেমরি থেকে পড়ার কাজ বেশি হয় এমন অপারেশনে Elixir-এ টাপল প্রায়ই ব্যবহৃত হয়, কারণ কোনো এলিমেন্ট পড়া একটি ধ্রুব সময়ের অপারেশন। এলিমেন্ট যদি চাহিদা অনুযায়ী যোগ বা বাদ করতে হয়, সেক্ষেত্রে সাধারণত টাপল ব্যবহার করা হয় না; কারণ বিদ্যমান টাপলটি পরিবর্তন না করে নতুন একটি টাপল তৈরি করা হয়, যার জন্য আগে থেকেই মেমরি বরাদ্দ করতে হয়।
বাস্তবে Elixir-এ টাপল তৈরি করা হয় দ্বিতীয় বন্ধনী দিয়ে। শূন্য-ভিত্তিক ইনডেক্সিং ব্যবহার করে elem/2 ফাংশন দিয়ে টাপলের প্রতিটি এলিমেন্ট আলাদা আলাদাভাবে পড়া যায়:
empty_tuple = {}
one_element_tuple = {1}
multiple_element_tuple = {1, :a, "hello"}
elem(multiple_element_tuple, 2)
# => "hello"
বাস্তবে দলবদ্ধ তথ্য প্রকাশ করতে টাপল প্রায়ই ব্যবহার করা হয়।
Float.ratio(0.25)
# => {1, 4} indicating the numerator and denominator of the fraction ¼
Elixir-এর দৃঢ় ও ইডিয়ম্যাটিক কোডে প্যাটার্ন ম্যাচিংয়ের ব্যবহারই প্রধান। আপনার মনে থাকতে পারে, =/2 আসলে অ্যাসাইনমেন্ট অপারেটর নয়, ম্যাচ অপারেটর হিসেবে বর্ণিত হয়। ম্যাচ অপারেটর ব্যবহার করলে, বাঁ দিকের প্যাটার্নটি ডান দিকের সাথে মিলে গেলে বাঁ দিকের যেসব ভ্যারিয়েবল থাকে সেগুলো বাইন্ড হয়ে যায়, এবং ডান দিকের মানটি রিটার্ন হয়। মিল না হলে একটি MatchError রেইজ হয়।
2 = 2
# => 2
# Literals can be matched if they are the same
2 = 3
# => ** (MatchError) no match of right hand side value: 3
{_, denominator} = Float.ratio(0.25)
# => {1, 4}
# the variable `denominator` is bound to the value 4
মনে রাখবেন, ম্যাচিং ঘটে ডান দিক থেকে বাম দিকে।
শেষ উদাহরণে, প্যাটার্ন ম্যাচে কোনো ভ্যারিয়েবলের দরকার না হলে _ লিখে সেটি বাদ দেওয়া যায়। _ দিয়ে শুরু হওয়া কোনো ভ্যারিয়েবলই রানটাইম ট্র্যাক করে না।
একাধিক ফাংশন ক্লজ তৈরি করার সময়ও প্যাটার্ন ম্যাচিং একটি দরকারি কৌশল। ফাংশনের আর্গুমেন্টেও প্যাটার্ন ম্যাচিং ব্যবহার করা যায়, যা ঠিক করে দেয় কোন ফাংশন ক্লজটি কল হবে: ফাইলের একেবারে উপরের ক্লজ থেকে শুরু করে নিচের দিকে যেতে যেতে যেটি প্রথমে মেলে, সেটিই। ভ্যারিয়েবল ফাংশন হেডে বাইন্ড করা যায় এবং ফাংশন বডিতে ব্যবহার করা যায়।
defmodule Example do
def named_function(:a = variable_a) do
{variable_a, 1}
end
def named_function(:b = variable_b) do
{variable_b, 2}
end
end
Example.named_function(:a)
# => {:a, 1}
Example.named_function(:b)
# => {:b, 2}
Example.named_function(:c)
# => ** (FunctionClauseError) no function clause matching in Example.named_function/1
বন্ধুদের জন্য কুকি বেক করার প্রস্তুতি নিতে গিয়ে দেখলেন, রেসিপিতে ব্যবহৃত কিছু পরিমাপ আপনাকে রূপান্তর করতে হবে। আপনি যেহেতু কেবল মেট্রিক পদ্ধতির সাথেই পরিচিত, তাই নিজের সুবিধার জন্য মার্কিন বেকিংয়ের কমন পরিমাপগুলোকে মিলিলিটার (mL)-এ রূপান্তর করার একটি উপায় বের করতে হবে।
আপনার সমাধানের জন্য এই রূপান্তর ছকটি ব্যবহার করুন:
| যে একক রূপান্তর করবেন | আয়তন | মিলিলিটার (mL)-এ |
|---|---|---|
| mL | 1 | 1 |
| মার্কিন কাপ | 1 | 240 |
| মার্কিন ফ্লুইড আউন্স | 1 | 30 |
| মার্কিন টিস্পুন | 1 | 5 |
| মার্কিন টেবিলস্পুন | 1 | 15 |
প্রশিক্ষণরত এক প্রতিভাবান প্রোগ্রামার হিসেবে আপনি ঠিক করলেন, তালিকাভুক্ত যেকোনো একক থেকে যেকোনো অন্য এককে (এমনকি নিজের মধ্যেও) রূপান্তর সহজ করতে মিলিলিটারকে একটি অন্তর্বর্তী একক হিসেবে ব্যবহার করবেন।
KitchenCalculator.get_volume/1 ফাংশনটি ইমপ্লিমেন্ট করুন। একটি ভলিউম-পেয়ার টাপল দেওয়া হলে, এটি শুধু সংখ্যাগত উপাদানটি রিটার্ন করবে।
KitchenCalculator.get_volume({:cup, 2.0})
# => 2.0
KitchenCalculator.to_milliliter/1 ফাংশনটি ইমপ্লিমেন্ট করুন। একটি ভলিউম-পেয়ার টাপল দেওয়া হলে, রূপান্তর ছক ব্যবহার করে এটি ভলিউমটি মিলিলিটারে রূপান্তর করবে।
প্রতিটি এককের জন্য ফাংশন তৈরি করতে একাধিক ফাংশন ক্লজ ও প্যাটার্ন ম্যাচিং ব্যবহার করুন। প্রতিটি একক বোঝাতে ব্যবহৃত অ্যাটমগুলো হলো: :cup, :fluid_ounce, :teaspoon, :tablespoon, :milliliter. রূপান্তরের ফলাফলটি একটি টাপলে মুড়ে রিটার্ন করুন।
KitchenCalculator.to_milliliter({:cup, 2.5})
# => {:milliliter, 600.0}
KitchenCalculator.from_milliliter/2 ফাংশনটি ইমপ্লিমেন্ট করুন। একটি ভলিউম-পেয়ার টাপল ও কাঙ্ক্ষিত একক দেওয়া হলে, রূপান্তর ছক ব্যবহার করে এটি ভলিউমটি কাঙ্ক্ষিত এককে রূপান্তর করবে।
প্রতিটি এককের জন্য ফাংশন তৈরি করতে একাধিক ফাংশন ক্লজ ও প্যাটার্ন ম্যাচিং ব্যবহার করুন। প্রতিটি একক বোঝাতে ব্যবহৃত অ্যাটমগুলো হলো: :cup, :fluid_ounce, :teaspoon, :tablespoon, :milliliter
KitchenCalculator.from_milliliter({:milliliter, 1320.0}, :cup)
# => {:cup, 5.5}
KitchenCalculator.convert/2 ফাংশনটি ইমপ্লিমেন্ট করুন। একটি ভলিউম-পেয়ার টাপল ও কাঙ্ক্ষিত একক দেওয়া হলে, এটি প্রদত্ত ভলিউমটি কাঙ্ক্ষিত এককে রূপান্তর করবে।
KitchenCalculator.convert({:teaspoon, 9.0}, :tablespoon)
# => {:tablespoon, 3.0}
Exercism-এ সাইন আপ করুন, Elixir ট্র্যাকের 58টি কনসেপ্ট168টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।