트랙
/
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 트레이트

실패할 수도 있는 변환에는 Option을 반환하는 TryInto를 사용해요.

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인 경우를 항상 처리해요
  • 부호 있는 타입과 부호 없는 타입 사이를 변환할 때는 오버플로와 언더플로를 고려해요

지침

모험을 좋아하는 연금술사 Astrid는 여러 세계에서 수집한 마법 측정 단위를 표준화하려고 해요. 어떤 세계에서는 음수가 될 수 있는 부호 있는 측정값을 사용하고, 다른 세계에서는 항상 양수인 부호 없는 측정값을 사용해요. 게다가 Astrid는 특정 희귀 재료를 위한 두 가지 사용자 정의 타입을 가지고 있는데, 이 타입들 사이를 쉽게 변환할 방법이 필요해요.

이번 임무는 Astrid가 부호 있는 정수와 부호 없는 정수를 서로 변환하도록 돕고, Cairo의 Into와 TryInto 트레이트를 사용해 특별한 재료 타입을 위한 사용자 정의 타입 변환을 만드는 거예요.

1. 부호 있는 마법 단위와 부호 없는 마법 단위 사이 변환

Astrid가 가진 측정값은 때때로 양수나 음수 값(부호 있는 정수)으로 나타나지만, 특정 작업에서는 값이 항상 양수(부호 없는 정수)가 되도록 해야 해요.

다음을 변환하는 함수를 작성해서 Astrid를 도와주세요:

  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. 사용자 정의 재료 타입 변환

Astrid는 두 가지 희귀 재료인 Essence와 Elixir를 다루는데, 이들은 사용자 정의 타입으로 표현돼요. Essence를 Elixir로 변환하고 싶지만, 그 반대 방향은 원하지 않아요.

Essence와 Elixir라는 두 가지 사용자 정의 타입을 만들고, Essence에서 Elixir로 변환하는 Into 트레이트를 구현해서 Astrid를 도와주세요.

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
}
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Cairo Exercism

마법의 측정 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Cairo 트랙을 개념 25개연습 문제 68개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.