04_Cairo 中的類型轉換#
此文章使用的 Cairo 編譯器版本:2.0.0-rc0。因為 Cairo 正在快速更新,所以不同版本的語法會有些許不同,未來將會將文章內容更新到穩定版本。
目前 Cairo 中的類型轉換主要是將各種類型的整數相互轉換,例如:u8、u16、u256、felt252 等。即使是 u8 和 u16 這兩種十分相似的類型,相互轉換也不像其他編程語言那樣輕鬆。
TryInto & Into traits#
首先需要介紹一下這兩個官方庫中提供的兩個traits。我們要實現整數類型相互轉換,就需要使用這兩個 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 同樣可以使用這兩個 trait 進行轉換。