docs > rust > 小ネタ

小ネタ

file read - 一括

file readを最短で行いたい。

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

//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(())
}

Stringの処理

文字コード、処理に合わせて都度調べたほうがいい(パターンも多すぎる)。 https://doc.rust-lang.org/std/string/struct.String.html

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を返すには?

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

#[allow(unused_variables)]

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