RustでSomeを取り扱う
Date:2019-01-02 00:27:20 +0900
Categories: Programming
Categories: Programming
こちらの続きです。前回のスクリプトで出したい項目を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<String> = 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
よっしゃ、コンパイルできたしちゃんと表示された。
Tweet