04_Cairo 中の型変換#
この記事で使用されている Cairo コンパイラのバージョン:2.0.0-rc0。Cairo は急速に更新されているため、異なるバージョンでは文法が若干異なる場合があります。将来的には、記事の内容を安定したバージョンに更新する予定です。
現在、Cairo での型変換は、u8、u16、u256、felt252 など、さまざまなタイプの整数の相互変換に主に使用されます。u8 と u16 のような非常に似たタイプの場合でも、他のプログラミング言語とは異なり、相互変換は容易ではありません。
TryInto & Into traits#
まず、これらの 2 つの公式ライブラリで提供される 2 つのtraitsを紹介します。整数型の相互変換を実現するために、これらの 2 つの traits を使用する必要があります。
(1). TryInto
TryInto trait は、try_into
関数を提供し、ソースタイプの範囲がターゲットタイプよりも大きい場合に使用します。例えば、felt252 を u32 に変換する場合です。try_into
関数の戻り値はOption<T>
型🔗Optionであり、ターゲットタイプに値を収めることができない場合は None を返します。収めることができる場合は Some を返します。Some が返された場合は、unwrap
関数を使用して戻り値をターゲットタイプに変換する必要があります。例を見てみましょう:
use traits::TryInto;
use option::OptionTrait;
fn main() {
let my_felt252 = 10;
let my_usize: usize = my_felt252.try_into().unwrap();
}
上記の例では、まず felt252 の変数my_felt252
を定義し、次にtry_into
を使用してOption<T>
型に変換し、Option が持つunwrap
関数を呼び出して、Option のジェネリック変数を usize 型の変数my_usize
に変換しています。
(2). Into
TryInto の知識を知った後は、Into は理解しやすいです。Into trait は、ターゲットタイプの範囲がソースタイプよりも大きい場合にinto
関数を提供します。オーバーフローエラーを心配する必要がないため、安心して変換できます。例えば、u32 を u64 に変換する場合です。into
関数は、ターゲットタイプの変数を直接返します。Option を使用して変換する必要はありません。
use traits::TryInto;
use traits::Into;
use option::OptionTrait;
fn main() {
let my_u8: u8 = 10;
let my_u16: u16 = my_u8.into();
let my_u256:u256 = my_felt252.into();
}
注意すべきは、u256 も同様にこれらの traits を使用して変換できることです。