المسارات
/
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
  • ضع في اعتبارك الفائض والنقصان عند التحويل بين الأنواع الموقّعة وغير الموقّعة

التعليمات

تحاول Astrid، وهي خيميائية مُغامِرة، أن توحّد الوحدات السحرية للقياس التي تجمعها من عوالم مختلفة. تستخدم بعض العوالم قياسات مُوقَّعة (يمكن أن تكون سالبة)، بينما تستخدم عوالم أخرى قياسات غير مُوقَّعة (وهي دائمًا موجبة). وفوق ذلك، لدى Astrid نوعان مُخصَّصان لمكوّنات نادرة معيّنة، وهي تحتاج إلى وسيلة للتحويل بسهولة بين هذين النوعين.

مهمتك هي مساعدة Astrid على التحويل بين الأعداد الصحيحة المُوقَّعة وغير المُوقَّعة، وإنشاء تحويلات مُخصَّصة لأنواع مكوّناتها الخاصة باستخدام السمتين Into وTryInto في Cairo.

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، وليس العكس.

ساعد Astrid بإنشاء نوعين مُخصَّصين، 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.