変数と型
変数を作る
Rust で変数を作るには let を使う.
fn main() {
let x = 42;
println!("{}", x); // 42
}
println! の {} は変数の値で置き換えられる.
変数はデフォルトで変更できない
fn main() {
let x = 42;
x = 100; // コンパイルエラー!
}
Rust の変数はデフォルトで変更不可.変更したいなら mut を付ける:
fn main() {
let mut x = 42;
x = 100; // OK
println!("{}", x); // 100
}
語弊注意: 他の言語でいう「定数」とは微妙に違うけど,今は「
mutがないと変更できない」とだけ覚えておこう.
数値型: 3 つだけ覚えろ
Rust には数値型がたくさんあるけど,とりあえずこの 3 つだけ覚えればいい:
| 型 | 何者か | 例 |
|---|---|---|
i32 |
普通の整数 | 42, -1, 0 |
usize |
配列のインデックスや長さに使う整数(0 以上) | 0, 1, 100 |
f64 |
小数 | 3.14, -0.5, 1.0 |
fn main() {
let age: i32 = 25;
let index: usize = 0;
let pi: f64 = 3.14;
println!("age: {}, index: {}, pi: {}", age, index, pi);
}
語弊注意: 実際には
i8,i16,i64,u8,u32,f32など大量にある.でもこのチュートリアルでは全部無視.i32,usize,f64で乗り切る.
型を書かなくても Rust が推論してくれることが多い:
fn main() {
let x = 42; // i32 と推論される
let y = 3.14; // f64 と推論される
}
基本的に型は省略できる.コンパイラが判断できないときだけ書けばいい.
型変換
型が違うと計算できない.as で変換する:
fn main() {
let a: i32 = 10;
let b: f64 = 3.14;
let result = a as f64 + b;
println!("{}", result); // 13.14
let index = a as usize;
println!("{}", index); // 10
}
bool
真偽値.true か false.
fn main() {
let is_cool = true;
let is_boring: bool = false;
println!("{} {}", is_cool, is_boring);
}
char
1 文字.シングルクォートで囲む.
fn main() {
let c = 'A';
let emoji = '🦀';
println!("{} {}", c, emoji);
}
あまり直接使うことはない.文字列(String)を使うことの方が多い.
String
文字列には 2 種類ある:
| 型 | 何者か |
|---|---|
&str |
文字列リテラル.コードに直接書いたやつ.固定. |
String |
動的な文字列.変更できる. |
fn main() {
let s1 = "hello"; // &str(文字列リテラル)
let s2 = String::from("hello"); // String
let s3 = "hello".to_string(); // これも String
println!("{} {} {}", s1, s2, s3);
}
語弊注意:
&strとStringの違いについて正確に説明すると長くなるので省略.迷ったらString::from("...")を使おう.&strが必要な場面でStringを渡しても大体うまくいく.
println! のフォーマット
fn main() {
let name = "Rust";
let version = 2021;
// 基本
println!("Hello, {}!", name);
// 複数の値
println!("{} edition {}", name, version);
// デバッグ表示(後で構造体のときに便利)
println!("{:?}", (1, 2, 3));
}
{} で普通の表示,{:?} でデバッグ表示.デバッグ表示は後の章で活躍する.
これで変数と型は OK.次は関数と制御フローを学ぼう.