تتيح لك تحويلات الأنواع في 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.
لدى Astrid قياسات تأتي أحيانًا بقيم موجبة أو سالبة (أعداد صحيحة مُوقَّعة)، لكنها تحتاج في بعض المهام إلى التأكد من أن القيم موجبة دائمًا (أعداد صحيحة غير مُوقَّعة).
ساعد Astrid بكتابة دالة تُحوِّل:
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"
تعمل 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
}
سجّل في Exercism لتتعلّم وتتقن Cairo عبر 25 مفهومًا68 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.