https://doc.rust-jp.rs/book/second-edition/ を読みながらRustを触っているので、基本的な文法をまとめていきます。所有権, 参照, ライフタイムなどは割愛します。
ソースコードはRust 1.38.0で動作確認しています。
変数
// immutable
let num1 = 1;
// mutable
let mut num2 = 2;
num2 = 4;
//shadowing
let num3 = 3;
let num3 = "3";
- letで変数定義
- デフォルトでは不変。mutを使うと可変になる
- 既存の変数と同名の変数を定義することで既存の変数にアクセスできなくする(シャドーイング)
定数
const NUM: i32 = 1;
- 常に型注釈が必要
- どのスコープでも定義可能
- 定数名はscreaming snake case
データ型
整数型
let num: i32 = 1;
i32, u32, i64など
浮動小数点型
let num: f32 = 1.2;
f32, f64
論理値型
let b: bool = true;
bool
文字型
let c: char = 'a';
char
タプル型
let (x, y, z) = (1, 2, 3);
let x = (1, 2);
println!("{}{}", x.0, x.1);
// 12
- ()で囲んだ値
- 複数の値, 複数の型を持つことができる
- パターンマッチングで要素を分解できる
-
x.0
のようにインデックスでアクセスできる
配列型
let array = [1, 2, 3];
- 固定長
- スタックに格納される
条件式
let a = 0;
if a == 0 {
println!("zero");
}
let a = 1
let num = if a >= 0 {
"positive number"
} else {
"negative number"
};
if 条件式 { 本体1 } else { 本体2 }
ループ
// loopを使ったループ
let i = 0;
loop {
if i > 10 {
break;
}
i += 1;
}
// whileを使ったループ
let i = 0;
while i <= 10 {
i += 1;
}
// forを使ったループ
for i in 1..10 {
}
構造体
struct User{
first_name: &'static str,
last_name: &'static str,
age: u32,
}
fn main(){
let yamada_taro = User {
first_name: "Taro",
last_name: "Yamada",
age: 20,
};
//構造体更新記法
let first_name = "Jiro";
let last_name = "Yamada";
let age = 20;
let yamada_jiro = User {
first_name,
last_name,
age,
};
}
-
struct
で構造体を定義 - 構造体のメンバと同じ変数を使うことで構造体の値のセットを構造体更新記法を使って省略して書くことができる
タプル構造体
struct Point(i32, i32);
fn main(){
let point = Point(1, 2);
}
メソッド
struct User{
first_name: &'static str,
last_name: &'static str,
age: u32,
}
impl User {
fn new(first_name: &'static str, last_name: &'static str, age: u32) -> User {
User {
first_name,
last_name,
age,
}
}
fn get_full_name(&self) -> String {
self.first_name.to_string() + self.last_name
}
}
fn main(){
let user = User::new("Taro","Yamada",1);
let full_name = user.get_full_name();
}
-
impl
を使ってメソッドを実装 - selfで構造体にアクセス
- 引数なしの関数は関連関数になる
enum
enum Language {
Java(bool),
Kotlin(i32, i32),
Rust(i32),
}
fn main(){
let java = Language::Java(true);
let kotlin = Language::Kotlin(1, 2);
let rust = Language::Rust(1);
}
-
enum
で列挙子を表現する
Option
enum Option<T> {
Some(T),
None
}
fn main(){
let optional_num: Option<u32> = Some(10);
}
- 値があるかどうかを表現する
- 初期化処理に含まれているため、接頭辞なしで
Some(T)
のように使うことができる
Result
enum Result<T, E>{
Ok(T),
Err(E),
}
- エラーが発生したかどうかを表現する
- エラーが発生しなければOk(T), エラーが発生した場合Err(E)を使う
match
let age = 10;
let is_ten = match age {
10 => true,
_ => false,
};
-
match
でパターンマッチをおこなうことができる -
_
を使うことでデフォルトのケースを表現できる