Rust Tips

Rustlangのtipsに関して書いていきます。 随時更新します。 完全にメモです。俺以外が見ても意味ないです。

現在、rust勉強中です。 まさかり投げないで間違ってたら優しく教えてください。 すぐに訂正いたします。 ご指摘お待ちしてます。

Json

extern crate serde_json;

でインポートして、使い方は、 Value型の変数にfrom_strとかでjson型のデータを保持できる。

extern crate serde_json;
extern crate serde_json::{Result, Value};

use serde_json::{Result, Value};

fn untyped_example() -> Result<()> {
    // Some JSON input data as a &str. Maybe this comes from the user.
    let data = r#"
        {
            "name": "John Doe",
            "age": 43,
            "phones": [
                "+44 1234567",
                "+44 2345678"
            ]
        }"#;

    // Parse the string of data into serde_json::Value.
    let v: Value = serde_json::from_str(data)?;

    // Access parts of the data by indexing with square brackets.
    println!("Please call {} at the number {}", v["name"], v["phones"][0]);

    Ok(())
}

あとは、任意の構造体に対してjsonにパースする方法。

use serde::{Deserialize, Serialize};
use serde_json::Result;

#[derive(Serialize, Deserialize)]
struct Address {
    street: String,
    city: String,
}

fn print_an_address() -> Result<()> {
    // Some data structure.
    let address = Address {
        street: "10 Downing Street".to_owned(),
        city: "London".to_owned(),
    };

    // Serialize it to a JSON string.
    let j = serde_json::to_string(&address)?;

    // Print, write to a file, or send to an HTTP server.
    println!("{}", j);

    Ok(())
}

エラー関係

.unwrap()

doc.rust-lang.org

Option<T>のやつみたいな感じ。 Noneだった時にpanicする。 なんかpanicやたらめったらされたら怖いから普通にmatchで実装した方がいいと思うけど、簡単な実装なら便利そう。

?

doc.rust-lang.org pythonでいうところのtry

before lib.rs

fn read_username_from_file() -> Result<String, io::Error> {
    let f = File::open("username.txt");

    let mut f = match f {
        Ok(file) => file,
        Err(e) => return Err(e),
    };

    let mut s = String::new();

    match f.read_to_string(&mut s) {
        Ok(_) => Ok(s),
        Err(e) => Err(e),
    }
}

after lib.rs

fn read_username_from_file() -> Result<String, io::Error> {
    let mut f = File::open("username.txt")?;
    let mut s = String::new();

    f.read_to_string(&mut s)?;

    Ok(s)
}

こんな感じ。 このコードはstd::fs::read_to_stringで一発で使える。

try!(try!(try!(foo()).bar()).baz())

foo()?.bar()?.baz()?

に省略できる。 エラーならErrreturnしてくれるっぽい。

#[derive(Debug)]

例えば、構造体

struct User {
    name: String,
    ange: u32,
}

このような構造体に対して、中身を出力しようとすると、

let BoKuToTsuZenU = User { name: String::from("BoKuToTsuZenU"), age: 100000};
println!("創造神冒頓単于のスペックワロタwwwwwwww{}", BoKuToTsuZenU);

こうすると、 エラーでます。 解決策は、

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

fn main() {
    let BoKuToTsuZenU = User {name: String::from("BoKuToTsuZenU"), age: 100000};
    println!("{:?}", BoKuToTsuZenU);
} 

これで動きます。または、{:#?}だとさらに見やすいかもしれない。

構造体のメソッド記法

struct User {
    name: String,
    age: u32
}

impl User {
    fn is_adult(&self) -> bool {
        if self.age > 20 { true }
        else { false}
    }
}

fn main() {
     let god = User{name: String::from("BoKuToTsuZenU"), age: 10000};
     let adult = god.is_adult();
     if adult {
         println!("{} is adult", god.name);
     }
     else {
         println!("{} is not adult", god,name);
     }
}

見たい感じ。詳しいことはここをクリック!!!!