Open14

Rustに入門する

mogamoga

Rustのinstallはrustupを使って入れる。

$ brew install rustup-init
$ rustup-init
mogamoga

忘れてたけどVSCodeには rust-analyzer いれた。あと以下をsetings.jsonに追記した。

  "[rust]": {
    "editor.defaultFormatter": "rust-lang.rust-analyzer",
    "editor.formatOnSave": true,
  },
  "rust-analyzer.checkOnSave.command": "clippy",
mogamoga

cargo new して cargo run しても linker cc not found ってエラーが出た。何やってもうまくいかなかったのでPC再起動したら治った。

mogamoga

作りたいものは実は決まっているんだけど、久しぶりに新しい言語を勉強するのと、C言語っぽい雰囲気の言語な感じがするのでリハビリも兼ねてちゃんと文法から学んでいく。

とりあえず snake_case を使うっぽくてあんまり好かん。

mogamoga

数値型が i8 とか u8 とか、なかなか低レベルな言語感あって渋くて良い。文字も char&strString があって、すごくメモリを意識しないとダメでなんか懐かしい。

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;
mogamoga

列挙型 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が予約語として登録されているみたいんで、使えなさそうだな。地味に不便そう。

mogamoga
#[derive(Debug)]
enum WebEvent {
    Sample,
    Press { kind: String },
}

#[derive(Debug)] をつけると println で表示するときに {:#?} で受け取れば出力してくれるようになると。 {:#?} は一瞬で忘れそう。

mogamoga

Rustの関数の戻り値は、return省略できるんだ。ちょっとRubyっぽさある。
セミコロンはつけちゃいけないと。

fn divide_by_5(num: u32) -> u32 {
    if num == 0 {
        // Return early
        return 0;
    }
    num / 5
}
mogamoga

配列関連。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);
mogamoga

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."
mogamoga

ループは 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);