تبدیل نوع در 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 استفاده کنیدOption::None را از TryInto مدیریت کنیدآسترید، یک کیمیاگر ماجراجو، در تلاش است واحدهای جادویی اندازهگیری را که از قلمروهای مختلف جمعآوری میکند استانداردسازی کند. برخی قلمروها از اندازهگیریهای علامتدار استفاده میکنند (که میتوانند منفی باشند) و برخی دیگر از اندازهگیریهای بدون علامت (که همیشه مثبتاند). علاوه بر این، آسترید برای بعضی مواد اولیهی کمیاب دو نوع سفارشی دارد و به راهی نیاز دارد که بهسادگی بین این نوعها تبدیل انجام دهد.
مأموریت شما این است که به آسترید کمک کنید بین اعداد صحیح علامتدار و بدون علامت تبدیل انجام دهد و با استفاده از دو trait به نامهای Into و TryInto در Cairo، تبدیلهای نوع سفارشی برای انواع مواد اولیهی خاص او بسازد.
آسترید اندازهگیریهایی دارد که گاهی با مقادیر مثبت یا منفی میآیند (اعداد صحیح علامتدار)، اما برای بعضی کارها باید مطمئن شود که مقادیر همیشه مثبت باشند (اعداد صحیح بدون علامت).
با نوشتن تابعی به آسترید کمک کنید که اینها را تبدیل کند:
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، و پیادهسازی trait Into برای تبدیل Essence به Elixir به آسترید کمک کنید.
تابعی بنویسید که یک 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
}