rust の変数宣言についてメモ
対象
rust 初学者
内容
rust を学び始めて、頭では分かったつもりでも実は混乱していた変数宣言関係を、一度書き出して整理。
// ふつーに i32 型。型推論は i32 がデフォルト。変更不可
let val_i32: i32 = 3;
assert_eq!(val_i32, 3);
// 他の型指定の時
let val_u64: u64 = 13;
assert_eq!(val_u64, 13);
// 参照。参照先も参照元(val_ref 自体)も変更不可
let val_ref = &23;
assert_eq!(*val_ref, 23);
// 変更可能な変数には、mut を付ける。
let mut val_mut = 33;
val_mut += 1;
assert_eq!(val_mut, 34);
// 変更可能な参照先の場合。val_ref_mut 自体は変更不可。
let val_ref_mut = &mut 43;
*val_ref_mut += 1;
assert_eq!(*val_ref_mut, 44);
// 参照先も変数自体も変更可能にする場合。
let mut val_mut_ref_mut = &mut 53;
*val_mut_ref_mut += 1;
val_mut_ref_mut = &mut *val_mut_ref_mut;
assert_eq!(*val_mut_ref_mut, 54);
// const は C 言語で言う所の #define
// コンパイル時に評価らしい。
const VAL_CONST: i32 = 63;
assert_eq!(VAL_CONST, 63);
// static 変数。.rodata 領域にいくやつ。
static VAL_STATIC: i32 = 73;
assert_eq!(VAL_STATIC, 73);
// static 変数の可変版。.data 領域にいくやつ。unsafe が必要。
static mut STATIC_MUT: i32 = 83;
unsafe { STATIC_MUT += 1; }
assert_eq!(84, unsafe { STATIC_MUT });ポイントは、変数そのものの変更可否と参照先の変更可否の両方があるということ。後デフォルトでは変更不可になること。
参照はポインタで、C++ の参照みたいな別名ってのではないみたい。参照外しは'*'。
const は #define 相当でしょうか。コンパイル時に評価。
static 変数は、どーも .bss セクションへの書き込みにはならないみたいで。初期化せずにはコンパイルは通らず、ゼロ初期化しても .bss へのアセンブリ書き込みはなさそうで分かりませんでした。他は、変更可能にする場合は unsafe が必要。