Note

RustでSomeを取り扱う

こちらの続きです。 前回のスクリプトで出したい項目をRustで引っ張ってくることができました。 $ cargo run /Users/ryo/Downloads/Photos/DSC04117.jpg Compiling exif v0.1.0 (/Users/ryo/work/ryo/study_rust/exif) Finished dev [unoptimized + debuginfo] target(s) in 0.93s Running `target/debug/exif /Users/ryo/Downloads/Photos/DSC04117.jpg`60004000F: Some(1.8)ISO: Some(320)Some(Ratio { numer: 1, denom: 200 }) こんな感じです。 Some(1.8) のSomeがなんだかわからなくて、次はこいつをどうにかしようと思いました。Stringで表現できれば良いってことですよね。 #### Someとは Someについて調べてみたらこいつはOption型で「型がない可能性がある」ものの列挙型らしい。型が存在する場合はSomeに包まれていて、ない場合はNoneが入っているらしい。こいつがどっちなのかを教えてあげなければ行けないらしい。 判定にはmatch式で値を取り出す必要があるみたいなんですが、もっと手軽に unwrap() を使うと値が取り出せるみたいです。もし None が入っている場合は None が返る(らしい)。 #### コードを書き換えた というわけでそれを元にコードを書き換えた ``` use std::env; use rexiv2;

fn main() { let args: Vec = env::args().collect(); let file_path = &args[1]; let meta = rexiv2::Metadata::new_from_path(&file_path).unwrap();

println!(“Width: {:?}”, meta.get_pixel_width()); println!(“Height: {:?}”, meta.get_pixel_height()); println!(“F: {:?}”, meta.get_fnumber().unwrap()); // ココ println!(“ISO: {:?}”, meta.get_iso_speed().unwrap()); // ココ println!(“Shutter: {:?}/{:?}”, meta.get_exposure_time().unwrap().numer(), meta.get_exposure_time().unwrap().denom()); // ココ } 出力はこちら ktmt-brkt:exif[master *]$ cargo run /Users/ryo/Downloads/Photos/DSC04117.jpg Compiling exif v0.1.0 (/Users/ryo/work/ryo/study_rust/exif) Finished dev [unoptimized + debuginfo] target(s) in 0.83s Running target/debug/exif /Users/ryo/Downloads/Photos/DSC04117.jpg Width: 6000 Height: 4000 F: 1.8 ISO: 320 Shutter: 1/200 ``` よっしゃ、コンパイルできたしちゃんと表示された。