Rustに入門する
ざっくりこれに従っていく
環境
- Apple Siliconのmac
- VSCode
Rustのinstallはrustupを使って入れる。
$ brew install rustup-init
$ rustup-init
忘れてたけどVSCodeには rust-analyzer
いれた。あと以下をsetings.jsonに追記した。
"[rust]": {
"editor.defaultFormatter": "rust-lang.rust-analyzer",
"editor.formatOnSave": true,
},
"rust-analyzer.checkOnSave.command": "clippy",
cargo new
して cargo run
しても linker cc not found
ってエラーが出た。何やってもうまくいかなかったのでPC再起動したら治った。
作りたいものは実は決まっているんだけど、久しぶりに新しい言語を勉強するのと、C言語っぽい雰囲気の言語な感じがするのでリハビリも兼ねてちゃんと文法から学んでいく。
とりあえず snake_case
を使うっぽくてあんまり好かん。
数値型が i8
とか u8
とか、なかなか低レベルな言語感あって渋くて良い。文字も char
や &str
や String
があって、すごくメモリを意識しないとダメでなんか懐かしい。
structは宣言しやすそうでとても良い。最近はDartを書くことが多いんだけど、Dartはclassを使わないといけなくて、宣言するのもまあまあめんどいから余計に良く感じる。
// Classic struct with named fields
struct Student { name: String, level: u8, remote: bool }
// Tuple struct with data types only
struct Grades(char, char, char, char, f32);
// Unit struct
struct Unit;
列挙型 enum には、SwiftのAssociated Valueみたいに値が紐付けられる。これは素晴らしい。
enum WebEvent {
// An enum variant can be like a unit struct without fields or data types
WELoad,
// An enum variant can be like a tuple struct with data types but no named fields
WEKeys(String, char),
// An enum variant can be like a classic struct with named fields and their data types
WEClick { x: i64, y: i64 }
}
やってみて気づいたけどstructのfieldとして type
っていうfieldが予約語として登録されているみたいんで、使えなさそうだな。地味に不便そう。
#[derive(Debug)]
enum WebEvent {
Sample,
Press { kind: String },
}
#[derive(Debug)]
をつけると println で表示するときに {:#?}
で受け取れば出力してくれるようになると。 {:#?}
は一瞬で忘れそう。
enumのpattern matchingは、match
っていう switch の上位互換のやつがRustにはあるのでそれを使う模様。ORとか範囲とかSome/Noneとかいろんな書き方があって便利そう。
Rustの関数の戻り値は、return省略できるんだ。ちょっとRubyっぽさある。
セミコロンはつけちゃいけないと。
fn divide_by_5(num: u32) -> u32 {
if num == 0 {
// Return early
return 0;
}
num / 5
}
配列関連。Rustの配列とは長さが固定のものを表す。自由にpush/popできるようにするにはvecを使う。
let numbers = [1, 2, 3];
// numbers.push(4) はそもそもpushというメソッドが存在しないのでできない
let mut next_numbers = vec![1, 2, 3];
next_numbers.push(4);
Rustのifは文としても式としても使える。便利ね。
let formal = true;
let greeting = if formal { // if used here as an expression
"Good day to you." // return a String
} else {
"Hey!" // return a String
};
println!("{}", greeting) // prints "Good day to you."
ループは loop {}
で無限ループが作れて、breakで出れる。シンプル。loopを式として使うこともできる。whileやfor inループもある。
let mut counter = 1;
// stop_loop is set when loop stops
let stop_loop = loop {
counter *= 2;
if counter > 100 {
// Stop loop, return counter value
break counter;
}
};
// Loop should break when counter = 128
println!("Break the loop at counter = {}.", stop_loop);
cookbook メモ 便利そう