S-JIS[2024-09-16/2024-10-14] 変更履歴

Rust letメモ

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で囲む必要がある。


Rustへ戻る / 技術メモへ戻る
メールの送信先:ひしだま