Cairo-তে টাইপ কনভার্সনের মাধ্যমে আপনি একটি টাইপ থেকে আরেকটি টাইপে ডেটা রূপান্তর করতে পারেন, যা নমনীয় ও নিরাপদ ডেটা ম্যানিপুলেশন সম্ভব করে।
Cairo টাইপ কনভার্সনের জন্য বেশ কয়েকটি পদ্ধতি দেয়:
সামঞ্জস্যপূর্ণ সংখ্যাগত টাইপের ক্ষেত্রে আপনি সরাসরি কাস্টিং ব্যবহার করতে পারেন:
let small_number: u8 = 42;
let big_number: u32 = small_number.into();
Into ট্রেইট একটি টাইপ থেকে আরেকটিতে রূপান্তর সক্ষম করে:
let value: u16 = 100;
let converted: u32 = value.into();
ব্যর্থ হতে পারে এমন কনভার্সনের জন্য TryInto ব্যবহার করুন, যা একটি Option রিটার্ন করে:
let large_value: u32 = 70000;
let small_value: Option<u16> = large_value.try_into();
match small_value {
Option::Some(v) => println!("Converted: {}", v),
Option::None => println!("Conversion failed"),
}
আপনি নিজের টাইপের জন্য Into ইমপ্লিমেন্ট করতে পারেন:
#[derive(Drop)]
struct Celsius {
value: i32,
}
#[derive(Drop)]
struct Fahrenheit {
value: i32,
}
impl CelsiusIntoFahrenheit of Into<Celsius, Fahrenheit> {
fn into(self: Celsius) -> Fahrenheit {
Fahrenheit { value: (self.value * 9) / 5 + 32 }
}
}
TryInto ব্যবহার করুন (যেমন বড় টাইপ থেকে ছোট টাইপে)Into ব্যবহার করুনTryInto থেকে আসা Option::None কেসগুলো সবসময় হ্যান্ডেল করুনঅ্যাস্ট্রিড নামের এক দুঃসাহসী আলকেমিস্ট বিভিন্ন জগৎ থেকে সংগৃহীত জাদুকরী পরিমাপ-এককগুলোকে একটি আদর্শ মানে আনতে চাইছেন। কিছু জগৎ সাইনড পরিমাপ ব্যবহার করে (যা ঋণাত্মক হতে পারে), আবার অন্য জগৎগুলো আনসাইনড পরিমাপ ব্যবহার করে (যা সবসময় ধনাত্মক)। তা ছাড়াও, কিছু বিরল উপকরণের জন্য অ্যাস্ট্রিডের কাছে দুটি কাস্টম টাইপ আছে, আর এই টাইপগুলোর মধ্যে সহজে রূপান্তর করার একটি উপায় তার দরকার।
আপনার কাজ হলো সাইনড ও আনসাইনড ইন্টিজারের মধ্যে রূপান্তরে অ্যাস্ট্রিডকে সাহায্য করা, এবং Cairo-র Into ও TryInto ট্রেইট ব্যবহার করে তার বিশেষ উপকরণ টাইপগুলোর জন্য কাস্টম টাইপ রূপান্তর তৈরি করা।
অ্যাস্ট্রিডের পরিমাপগুলো কখনো ধনাত্মক বা ঋণাত্মক মান হিসেবে আসে (সাইনড ইন্টিজার), কিন্তু কিছু কাজের জন্য তাকে নিশ্চিত করতে হয় যে মানগুলো সবসময় ধনাত্মক (আনসাইনড ইন্টিজার)।
এমন একটি ফাংশন লিখে অ্যাস্ট্রিডকে সাহায্য করুন যা রূপান্তর করে:
i32) থেকে একটি আনসাইনড ইন্টিজার (u16)।u16) থেকে একটি সাইনড ইন্টিজার (i32)।let signed_value: i32 = -42;
match convert_signed_to_unsigned(signed_value) {
Option::Some(v) => println!("Converted to unsigned: {}", v),
Option::None => println!("Failed to convert: {}", signed_value),
} // prints "Failed to convert: -42"
let unsigned_value: u16 = 42;
let signed_value: i32 = convert_unsigned_to_signed(unsigned_value);
println!("Converted to signed: {}", signed_value); // prints "Converted to signed: 42"
অ্যাস্ট্রিড দুটি বিরল উপকরণ নিয়ে কাজ করেন, Essence আর Elixir, যেগুলো কাস্টম টাইপ দিয়ে প্রকাশ করা হয়। তিনি Essence-কে Elixir-এ রূপান্তর করতে চান, কিন্তু উল্টো দিকে নয়।
দুটি কাস্টম টাইপ, Essence ও Elixir, তৈরি করে এবং Essence থেকে Elixir-এ রূপান্তর করার জন্য Into ট্রেইট ইমপ্লিমেন্ট করে অ্যাস্ট্রিডকে সাহায্য করুন।
এমন একটি ফাংশন লিখুন যা একটি Essence নেয় এবং .into() ব্যবহার করে সেটিকে একটি Elixir-এ রূপান্তর করে।
#[derive(Drop)]
struct Essence {
potency: u16,
}
#[derive(Drop)]
struct Elixir {
strength: u16,
}
fn convert_essence_to_elixir(essence: Essence) -> Elixir {
// Convert the Essence to Elixir using the Into trait.
essence.into()
}
fn main() {
let essence = Essence { potency: 100 };
let elixir: Elixir = convert_essence_to_elixir(essence);
println!("Elixir strength: {}", elixir.strength); // Elixir strength: 100
}
Exercism-এ সাইন আপ করুন, Cairo ট্র্যাকের 25টি কনসেপ্ট68টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।