RustでSomeを取り扱う

Katsumata Ryo
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

よっしゃ、コンパイルできたしちゃんと表示された。

--

--