RustでSomeを取り扱う
3 min readJan 1, 2019
こちらの続きです。
前回のスクリプトで出したい項目を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`
6000
4000
F: 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
よっしゃ、コンパイルできたしちゃんと表示された。