A Cairo-ban a típuskonverziók segítségével az adatokat egyik típusból a másikba alakíthatod, ami rugalmas és biztonságos adatkezelést tesz lehetővé.
A Cairo több mechanizmust kínál a típuskonverzióhoz:
Kompatibilis numerikus típusoknál közvetlen kasztolást használhatsz:
let small_number: u8 = 42;
let big_number: u32 = small_number.into();
Az Into trait egyik típusból a másikba való átalakítást tesz lehetővé:
let value: u16 = 100;
let converted: u32 = value.into();
Azokhoz az átalakításokhoz, amelyek meghiúsulhatnak, használd a TryInto-t, amely egy Option-t ad vissza:
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"),
}
A saját típusaidhoz is implementálhatod az Into traitet:
#[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-t, ha az átalakítás meghiúsulhat (például nagy típusból kicsibe)Into-t, ha az átalakítás mindig sikerülTryInto-ból származó Option::None eseteketAstrid, a kalandvágyó alkimista, igyekszik egységesíteni a különböző birodalmakból gyűjtött mágikus mértékegységeket. Néhány birodalom előjeles mértékegységeket használ (amelyek negatívak is lehetnek), mások viszont előjel nélkülieket (amelyek mindig pozitívak). Ráadásul Astridnak két egyedi típusa van bizonyos ritka hozzávalókhoz, és szeretné, ha könnyedén át tudna alakítani közöttük.
A küldetésed, hogy segíts Astridnak az előjeles és előjel nélküli egészek közötti átváltásban, valamint hogy a Cairo Into és TryInto traitjeivel egyedi típuskonverziókat hozz létre a különleges hozzávalóihoz.
Astrid mérései néha pozitív vagy negatív értékként érkeznek (előjeles egészek), bizonyos feladatokhoz viszont biztosítania kell, hogy az értékek mindig pozitívak legyenek (előjel nélküli egészek).
Segíts Astridnak egy olyan függvény megírásával, amely átváltja:
i32) előjel nélküli egésszé (u16).u16) előjeles egésszé (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 két ritka hozzávalóval dolgozik, amelyeket egy-egy egyedi típus, az Essence és az Elixir képvisel. Szeretné Essence-ből Elixir-t készíteni, de visszafelé nem.
Segíts Astridnak létrehozni két egyedi típust, az Essence-t és az Elixir-t, és megvalósítani az Into traitet, amellyel Essence-ből Elixir-t lehet átalakítani.
Írj egy függvényt, amely fogad egy Essence-t, és a .into() segítségével Elixir-ré alakítja.
#[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
}
Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Cairo nyelvet 25 fogalom68 feladat segítségével, valódi emberi mentorálással, mindez ingyen.