プログラムのお勉強メモ

プログラムの勉強メモです. Python, Rust, など.

実践Rustプログラミング入門 1日目

概要

  • 実践Rustプログラミング入門を買いました
  • 読み進めた時に書いたコードやメモを書き残していきます

1日目のお勉強

  • 変数と定数
  • trait
  • enum
  • if-match

変数と定数

  • 基本的には定数
  • 変数にしたい場合 mut を変数宣言に付けないといけない
let fixed_number = 1; // 定数
let mut mutable_number = 2; // 変数

trait

  • Javaで言うところの interface と実装クラスを実現するためのものらしい
  • trait で 関数定義をして, struct に実装していく
// Javaで言うところのInterfaceの宣言
trait MyInterface {
    fn myFunction() -> i64;
}

struct MyStruct;

// trait名 for struct名 という並び
// Java だと public class Hoge implements Interface名だから混乱する
impl MyInterface for MyStruct {
    fn myFunction(&self) -> i64 {
        100
    }
}

enum

  • enum で定義したものに関しては match 文で全パターン網羅した if-else 構文的なものが作れる
  • まだ使ってないからわからんが Option, Result は enumで定義されたものらしい
    • Result型に unwrap_or(x) を使うとOkだった場合はそのまま展開, Errだった場合には x が応答される

enum + match

enum MyEnum {
    Status1,
    Status2(i32),
    Status3(String),
}

fn main() {
    let test = MyEnum::Status2(100);

    match test {
        MyEnum::Status1 => println!("This is Status1."),
        MyEnum::Status2(x) => println!("This is Status2. get Number {}.", x),
        MyEnum::Status3(x) => println!("This is Status3. get String {}.", x),
    }
}
  • 出力結果
This is Status2. get Number 100.

Result

fn main() {
    let result: Result<String, String> = Ok("ok".to_string());
    println!("I get {}", result.unwrap_or("ng".to_string()));

    let result: Result<String, String> = Err("error".to_string());
    println!("I get {}", result.unwrap_or("ng".to_string()));
}
  • 出力結果
I get ok
I get ng // I get error ではなく I get ng になっている

if-match

  • 条件分岐
  • if 文や match 文を直接変数に突っ込んで応答値を返せるっぽい
fn main() {
    // if の場合
    let result = 200;
    let return_val: Result<i32, String> = if result == 200 {
        Ok(200)
    } else {
        Err(format!("error code is {}.", result))
    };

    match return_val {
        Ok(x) => println!("{} ok.", x),
        Err(x) => println!("{}", x),
    }

    // match の 場合
    let error_result: Result<i32, String> = Err(format!("error code is 503."));
    let match_result = match error_result {
        Ok(x) => format!("{} ok.", x),
        Err(x) => format!("{}", x),
    };

    println!("{}", match_result);
}
  • 出力結果
200 ok.
error code is 503.

感想

  • 割と書いてて楽しい
  • 最初とっつきづらいかと思ったけど思ったより書ける