他の言語(C++など)を既にやったことがある人向け
基本型
- bool(true/false)
- i8(8bit integer), i16, i32, i64
- u8(8bit unsigned integer), u16, u32, u64
- f32(32bit-floating point), f64
- isize, usize(そのマシンのポインタサイズと同じサイズの整数型)
true, false, 10i32, 100us, 1.234f32
- 固定長配列: array, tuple
[1i32, 2i32, 3i32] # array: 同じ型
(1i32, "hello", true) # tuple: 型は自由
- &[T]: slice
- &str:文字列リテラル=文字配列のスライス
"UTF-8の文字列のみOK"
リテラルの書き方
コメント
// 一行
/* /* */ */ // ネストOKなブロックコメント
bool
true, false
文字列
'あ' // UTF-8一文字: char型
"文字列\u3000\U30000000" // UTF-8文字列: &str型
r"raw文字列"
r#"ダブルクォート(")がそのまま書けるraw文字列"#
r####"無限に#記号を増やせる"####
バイト配列
b'a` // 1バイト: u8型
b"abc\x20" // バイト配列: &[u8]型
br"rawバイト列"
数値型
数字のリテラルの末尾に、型を付記して宣言する。
// 数値型にはアンダースコアを自由に付けて見やすく出来る
100_000_000i32 // 数値型(32bit integer)
0xffffis, 0o77us, 0b10101010u64, 1.2e3f32 // 16進, 8進, 2進, 32bit浮動少数
isize, usizeはそれぞれis, usと省略が可能
型を省略した場合、整数ならi32, 浮動小数ならf64になる模様
println!("{:?}, {:?}", 1, 1.2); // => 1i32, 1.2f64
関数, struct, enum, module, trait定義
// module: namespaceみたいな
mod name {
}
// fn 関数名(引数: 型) -> 返り値 { 中身 }
fn function(x: i32) -> bool {
if x == 1 { true } else { false }
}
// struct { メンバ, メンバ, }
struct Point {
x: i32,
y: i32,
}
// enum { メンバ, メンバ, }
enum Words {
Hello,
World,
}
// tuple struct
struct IntArray2(i32, i32);
// enum with value
enum WithInt {
Value(i32),
Nothing,
}
// trait: インターフェイスみたいな実装制約
trait Trait {
fn func(&self) -> bool;
}
変数バインディング(宣言)
// let 変数名: 型 = ...;
let x: i32 = 1i32;
let y: &str = "Hello";
// mutキーワードで変更可能(非const)
let mut z: usize = 10us;
z = 5us;
// 型は推論されるので適宜省略可能
let a = 1.0f32;
制御
// if
let x = 2i32;
if x == 1 {
// ...
} else if x == 2 {
// ...
} else {
// ...
}
// ifは{}内でセミコロンを付けなければその条件に応じた値を返す
let y = if x == 1 { true } else { false };
// for, while, loop: break, returnはC/C++と同じ様に使える
for x in range(0, 10) {...}
while condition == true {...}
loop {/* 無限ループ */}