Перетворення типів у Cairo дають змогу трансформувати дані з одного типу в інший, що забезпечує гнучку та безпечну роботу з даними.
Cairo надає кілька механізмів перетворення типів:
Для сумісних числових типів можна використовувати пряме приведення:
let small_number: u8 = 42;
let big_number: u32 = small_number.into();
Into
Трейт Into уможливлює перетворення з одного типу в інший:
let value: u16 = 100;
let converted: u32 = value.into();
TryInto
Для перетворень, які можуть не вдатися, використаймо 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
Астрід, алхімікиня, яка любить пригоди, намагається стандартизувати магічні одиниці вимірювання, які вона збирає з різних світів. Деякі світи використовують знакові вимірювання (які можуть бути відʼємними), а інші використовують беззнакові (які завжди додатні). До того ж, Астрід має два власні типи для певних рідкісних інгредієнтів, і їй потрібен спосіб легко перетворювати між цими типами.
Наше завдання полягає в тому, щоб допомогти Астрід перетворювати між знаковими та беззнаковими цілими числами, а також створити перетворення власних типів для її особливих типів інгредієнтів, використовуючи трейти 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, та реалізувавши трейт Into для перетворення з Essence на Elixir.
Напишіть функцію, яка приймає Essence і перетворює його на Elixir за допомогою .into().
#[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 вправ та справжнє наставництво від людей, і все це безкоштовно.