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()
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()?
に省略できる。
エラーならErr
をreturn
してくれるっぽい。
#[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); } }
見たい感じ。詳しいことはここをクリック!!!!