記事ディレクトリ
変数と変動性
変数は let キーワードを使用して宣言され、デフォルトでは変数は不変 (Immutable) です。変数を宣言するときは、変数の前に mut を追加して、変数を可変にします。
fn main() {
println!("Hello, world!");
let mut x = 5;
println!("The value of x is {}",x);
x = 6;
println!("The value of x is {}",x);
}
変数と定数
定数 (定数)、定数も値をバインドした後は不変ですが、不変変数とは多くの違いがあります。
- mut は使用できません。定数は常に不変です。
- 定数の宣言には const キーワードを使用し、その型をマークする必要があります。
- 定数は、グローバル スコープを含む任意のスコープで宣言できます。
- 定数は定数式にのみバインドでき、関数呼び出しの結果や実行時にのみ計算できる値にはバインドできません。
定数は、プログラムの実行中に宣言されたスコープ内で有効のままです。命名規則: Rust の定数はすべて大文字を使用し、各文字はアンダースコアで区切られます (例: MAX_POINTS)。
const MAX_POINTS:u32 = 100_000;
シャドーイング
同じ名前で新しい変数を宣言すると、その新しい変数は、以前に宣言された同じ名前の変数をシャドウ (非表示) します。後続のコードでは、この変数名が新しい変数を表します。
シャドウは、変数を mut としてマークすることと同じではありません。let キーワードを使用しない場合、非 mut 変数を再代入するとコンパイル時エラーが発生します。また、let を使用して宣言された同じ名前の新しい変数も不変です。 。let を使用して、同じ名前の新しい変数を宣言します。以前とは異なる型にすることもできます。
let space= " ";
let space = space.len();
データの種類
Rust は静的にコンパイルされる言語であり、すべての変数の型はコンパイル時に既知である必要があります。使用される値に基づいて、コンパイラは通常、その具体的な型を推測できます。ただし、使用可能な型が多数ある場合 (文字列を整数に変換する解析メソッドなど)、型の注釈を追加する必要があります。追加しないとエラーが報告されます。
スカラー型
スカラー型は単一の値を表し、Rust には整数型、浮動小数点型、ブール型、文字型の 4 つの主なスカラー型があります。
1. 整数型
整数型には小数部がありません。たとえば、u32 は符号なし整数型で、32 ビットの空間を占有します。符号なし整数は u で始まり、符号付き整数は i で始まります。Rust の整数型のリストを図に示します。
それぞれは i と u および固定桁数に分割されます。符号付き範囲: -2 n-1~ 2 n-1 -1。符号なしの範囲: 0 ~ 2n - 1。
issize タイプと usesize タイプのビット数は、プログラムが実行されているコンピューターのアーキテクチャによって決まります。64 ビット コンピューターの場合は、64 ビットです。issize または usesize を使用する主なシナリオは、ある種のコレクションのインデックスを作成することです。
整数のリテラル値を次の図に示します。
型サフィックスは、バイト型を除くすべての数値リテラルに使用できます。どの型を使用すればよいかわからない場合は、Rust の対応するデフォルト型を使用できます。整数のデフォルト型は i32 で、これは 64 ビット システムでも一般に高速です。
整数オーバーフロー: たとえば、u8 の範囲は 0~255 です。u8 変数の値を 256 に設定し、デバッグ モードでコンパイルすると、Rust は整数オーバーフローをチェックし、実行時にプログラムがパニックになります。モード (-release ) でコンパイルすると、Rust はパニックを引き起こす可能性のある整数オーバーフローをチェックしません。オーバーフローが発生した場合、Rust はラップアラウンド操作を実行し、256 は 0、257 は 1 になりますが、プログラムはパニックにはなりません。
2. 浮動小数点型
Rust には 2 つの基本的な浮動小数点型、つまり小数部分を持つ型があります。
- f32、32 ビット、単精度
- f64、64 ビット、倍精度
Rust の浮動小数点型は IEEE-754 標準を使用して表現され、f64 がデフォルトの型になります。これは、f64 が最新の CPU の f32 とほぼ同じ速度であり、精度が高いためです。
3. ブール型
Rust のブール型にも、true と false の 2 つの値があります。サイズは1バイト、記号はboolです。
4. 文字の種類
Rust 言語の char 型は、言語の最も基本的な単一文字を記述するために使用されます。文字タイプのリテラル値は一重引用符を使用し、4 バイトを占めます。これは Unicode スカラー値であり、ASCII よりも多くの文字内容 (ピンイン、中国語、日本語、韓国語、長さ 0 の空白文字、絵文字表現など) を表すことができます。 。Unicode スカラー値の範囲は U+0000 から U+D7FF、および U+E000 から U+10FFFF です。ただし、Unicode には文字の概念がないため、直感的な文字は Rust の概念と一致しない可能性があります。
複合タイプ
複合型を使用すると、単一の型内に複数の値を含めることができます。Rust は、タプルと配列という 2 つの基本的な複合タイプを提供します。
1.タプル
タプルは複数の型の値を一つの型にまとめることができ、タプルの長さは固定であり、一度宣言すると変更することはできません。パターン マッチングを使用してタプルを構造解除し、その要素の値を取得できます。
let tup: (i32, f64, u8)=(100, 6.4, 1);
println!("{},{},{}", tup.0, tup.1, tup.2);
let (x, y, z) = tup;
println!("{},{},{}", x, y, z);
2. 配列
配列は 1 つの型に複数の値を格納することもでき、配列内の各要素は同じ型である必要があります。データをヒープ (heap) ではなくスタック (stack) に保存したい場合、または固定数の要素を保証したい場合は、現時点では配列を使用する方が有利です。配列はスタック上に割り当てられた単一のメモリ ブロックであり、インデックスを使用して配列の要素にアクセスできます。アクセスされたインデックスが配列の範囲を超えている場合、コンパイルは成功し、実行時にエラーが報告され (ランタイムはパニックになります)、Rust は対応するアドレスのメモリにアクセスし続けることを許可しません。
let a: [i32; 5]=[1, 2, 3, 4, 5];
println!("{},{},{}", a[1], a[2], a[3]);
関数
関数を宣言するには、 fn キーワードを使用します。規則により、関数名と変数名については、Rust はスネークケースの命名規則を使用します。すべての文字は小文字で、単語はアンダースコアで区切られます。
fn main() {
another_function();
}
fn another_function() {
println!("Another function")
}
パラメータがある場合は、各パラメータの型を宣言する必要があります。
fn main() {
another_function(5);
}
fn another_function(x:i32) {
println!("The value of x is:{}", x);
}
関数は一連のステートメントで構成され、オプションで式で終了することもできます。Rust は式ベースの言語であり、ステートメントは何らかのアクションを実行する命令であり、式は値として評価されます。関数の定義もステートメントであり、ステートメントは値を返さないため、let を使用してステートメントを変数に代入することはできません。
fn main() {
let x = 5;
let y = {
let x = 1;
x + 3
};
println!("The value of y is {}",y);
}
-> 記号の後に、関数の戻り値の型を宣言しますが、戻り値に名前を付けることはできません。Rustでは戻り値は関数本体の最後の式の値になりますが、早く戻りたい場合はreturnキーワードを使って値を指定する必要があります。ほとんどの関数は、デフォルトで最後の式を戻り値として使用します。
fn five()->i32{
5
}
fn plus_five(x: i32)->i32{
x + 5
}
fn main() {
let x = five();
println!("The value of x is {}",x);
let x = plus_five(5);
println!("The value of x is {}",x);
}
if 式
if 式を使用すると、条件に基づいてさまざまなコード分岐を実行できます。条件は bool 型でなければなりません。if 式では、条件に関連付けられたコード ブロックを分岐 (アーム) と呼びます。オプションで、else 式を後に追加できます。
fn main() {
let number = 3;
if number < 5 {
println!("condition was true");
} else {
println!("condition was false");
}
}
複数の else if を使用する場合。その場合は、コードをリファクタリングするために match を使用することをお勧めします。
fn main() {
let number = 3;
match number < 5 {
true => println!("condition was true"),
false => println!("condition was false"),
}
}
if は式なので、let ステートメントの等号の右側に置くことができます。
fn main() {
let condition = true;
let number = if condition {
5 } else {
6 };
println!("The value of number is {}", number);
}
サイクル
1.ループ
loop キーワードは、停止を指示するまでコードのブロックを繰り返し実行するように Rust に指示します。
fn main() {
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 10 {
break counter * 2;
}
};
println!("The value of result is {}", result);
}
2.ながら
もう 1 つの一般的なループ パターンは、ループ本体の各実行前に条件を評価することです。このパターンでは while 条件ループが生成されます。
fn main() {
let mut number = 3;
while number != 0 {
println!("{}!", number);
number = number - 1;
}
}
3.for
for ループを使用してコレクションを反復処理します。while またはループを使用してコレクションを走査することもできますが、エラーが発生しやすく (インデックスがコレクション サイズを超える)、非効率的です (各ループで条件が true かどうかが判断されます)。for ループを使用すると、コレクション内の各要素に対してコードを実行でき、より簡潔でコンパクトになります。for ループは、その安全性とシンプルさのため、Rust で最もよく使用されます。
fn main() {
let a = [10, 20, 30, 40, 50];
for element in a.iter() {
println!("The value is {}", element);
}
}
for ループを使用して、上記の while ループの内容を実装します。標準ライブラリには範囲が用意されており、開始番号と終了番号を指定できます。range はそれらの間の番号 (終了を除く) を生成でき、rev メソッドは範囲を反転できます。
fn main() {
for number in (1..4).rev() {
println!("{}!", number);
}
}