小ネタ

file read - 一括

file readを最短で行いたい。

1行でfile readを書くと、下のようになるが、

  • mainに返り型Result<(), Box<dyn std::error::Error>>
  • mainの最後にOk(()) が必要になる。その他、useも省略して、フルパスで関数を書いた。結局色々書くこととなる。
//use std::fs;
//use std::path::Path;
fn main() -> Result<(), Box<dyn std::error::Error>> {
    let rf = std::fs::read_to_string(std::path::Path::new("src/main.rs"))?;
    println!("file: {}", rf);
    Ok(())
}

file read - 一行ずつ

use std::fs::File;
use std::io::{self, BufRead, BufReader};

fn main() -> io::Result<()> {
    let file = File::open("input.txt")?;
    let reader = BufReader::new(file);

    for line in reader.lines() {
        let line = line?; // io::Result<String> を処理
        println!("{}", line);
    }

    Ok(())
}
  • ?を使ったら、返り型io::Result<()>・値(OK(()))必要
  • expectで書けば不要になるけど、どちらも失敗した時に止まる。

Stringの処理

文字コード、処理に合わせて都度調べたほうがいい(パターンも多すぎる)。 String in std::string - Rust

String

連結

let mut s:String = String::from("hello");
s.push_str(" world!");
// または
s = format!("{} {}", s, "world!");

println!("{}", s);

http通信

asyncを不使用のパターン:CLIなど使用される場面を扱う。ただStringにするところまで。

[dependencies]
reqwest = { version = "0.11", features = ["blocking", "json"] }
# jsonはオプション
fn main() -> Result<(), reqwest::Error> {
    let res = reqwest::blocking::get("https://httpbin.org/get")?
        .text()?;

    println!("{}", res);
    Ok(())
}

JSON

[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
use serde::Deserialize;

#[derive(Deserialize, Debug)]
struct User {
    id: u32,
    name: String,
}

fn main() {
    let json = r#"{ "id": 1, "name": "Alice" }"#;

    let user: User = serde_json::from_str(json).unwrap();
    println!("{:?}", user);
}

http + json

.jsonがポイント

use serde::Deserialize;

#[derive(Debug, Deserialize)]
struct Response {
    url: String,
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let data: Response = reqwest::blocking::get("https://httpbin.org/get")?
        .json()?;   // 内部で text + deserialize

    println!("{:?}", data);
    Ok(())
}

valueを返すには?

  • struct(必要な部分だけ)を作って、変数.キーで取り出す
  • let url = v["url"].as_str().unwrap();

属性(attribute) - 未使用変数の許可

#[allow(unused_variables)]
  • #[allow(…)] → 許可(警告抑制)の属性
  • #[deny(…)] → 警告をエラーに変える属性
  • #[warn(…)] → 明示的に警告を出す属性

用途によって警告の制御やコンパイラの挙動を調整