Треки
/
Cairo
Cairo
/
Вправи
/
Магічні вимірювання
Магічні вимірювання

Магічні вимірювання

Навчальна вправа

Вступ

Перетворення типів у 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.

1. Перетворення магічних одиниць між знаковими та беззнаковими

Астрід має вимірювання, які іноді бувають додатними або відʼємними (знакові цілі числа), але для деяких завдань їй потрібно, щоб значення завжди були додатними (беззнакові цілі числа).

Допоможіть Астрід, написавши функцію, яка перетворює:

  1. Знакове ціле число (i32) у беззнакове ціле число (u16).
  2. Беззнакове ціле число (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"

2. Перетворення власних типів інгредієнтів

Астрід працює з двома рідкісними інгредієнтами, 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
}
Редагувати через GitHub Посилання відкривається в новому вікні або вкладці
Cairo Exercism

Час розпочати Магічні вимірювання?

Зареєструйтеся на Exercism, щоб вивчати й опановувати Cairo, а також 25 концепцій68 вправ та справжнє наставництво від людей, і все це безкоштовно.