Rustのlet文のメモ。
Rustで変数に値を束縛(bind)する(代入する)のがlet文。
let 変数〔: 型〕= 値; // 不変変数
let mut 変数〔: 型〕= 値; // 可変変数
変数名はsnake_caseで命名する。
変数名をアンダースコア「_」で始めると、その変数は未使用(後続処理で使われない)という扱いになる。
(未使用の変数があるとコンパイル時に警告が出るが、アンダースコアで始まる変数の場合は警告が出ない)
変数名すら付けずに「_」を使うことも出来る。
Rustでは同一スコープ内で同じ変数名の変数を再度letすることが出来る。→シャドーイング
letの例。
例 | 説明 | Java相当 | Scala相当 |
---|---|---|---|
let n = 123; |
データ型は省略できる。 |
final var n = 123; |
val n = 123 |
let n: i32 = 123; |
データ型を明示する例。 |
final int n = 123; |
val n: Int = 123 |
let mut n = 123; n = 456; // 再束縛可 |
可変変数。 |
var n = 123; n = 456; // 再代入可 |
var n = 123 n = 456 // 再代入可 |
let (a, b, c) = (1, 2, 3); let (a, _, _) = (1, 2, 3); let (a, ..) = (1, 2, 3); |
タプルのパターンマッチの例。 「 _ 」は任意の要素1個に対応する。「 .. 」は残りの要素全てに対応する。 |
val (a, b, c) = (1, 2, 3) val (a, _, _) = (1, 2, 3) |
|
let n; n = 123; |
letで値を指定せず、後から代入することが出来る。 型の推論もしてくれる。 (mutでない限り、その後の再代入は不可) |
final int n; n = 123; |
Rustでは、letした変数と同名の変数を、同一スコープ内で再度letすることが出来る。
再度letすると、以前の変数は使えなくなる(見えなくなる・隠蔽される)。
再度letするときは、型も以前のものと違っていても良い。
let n = 99; // i32 println!("n1 = {}", n); // 99 let n = 'a'; // char println!("n2 = {}", n); // a
let n = 123; println!("n1 = {}", n); // 123 { let n = 456; println!("n2 = {}", n); // 456 } println!("n3 = {}", n); // 123
シャドーイングは、同じものを意味しているが異なる型に変換しておきたい場合に便利。
let text = "abc"; // textの型は&str let text = String::from(text); // シャドーイング。textの型はString
定数は(letでなく)constで定義する。
const 定数名: 型 = 固定値;
定数名はSNAKE_CASEにする。
constでは必ず型を指定する必要がある。
const MAX: i32 = 999;
静的変数(グローバルな変数)はstaticで定義する。[2024-10-14]
static〔mut〕変数名: 型 = 固定値;
staticでは必ず型を指定する必要がある。
静的変数の値を変更する場合はmutを付けて可変にする。
staticで指定できる値は、固定値のみ。
つまり、「構造体::new()」等の関数を呼ぶことは出来ない。
static STATIC1: i32 = 1; static mut STATIC2: i32 = 2; fn main() { println!("{}", STATIC1); println!("{}", unsafe { STATIC2 }); unsafe { STATIC2 = 222 }; println!("{}", unsafe { STATIC2 }); }
可変(mut)な静的変数の場合、使用する際にはunsafeで囲む必要がある。