Tambourine作業メモスマートフォン用の表示で見るTambourine作業メモ主にスキル習得のためにやった作業のメモ。他人には基本的に無用のものです。この広告は、90日以上更新していないブログに表示しています。2017-05-09Rustでも遊びたいhttps://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/README.htmlを一通り読んでみた。日々のツールを作ってみながら覚えるのがよろしかろう。ファイルIOが使えないとつまらないので、テキストファイルの最後の1行を出力するようなものを作ってみよう。hoge.txtと同じ動作をするものだ。lines.lastの2行である(tailコマンドと内部的な動作は全然違うけど、巨大なファイルを食わせなければ見た目は同じである)。ARGVを使わずにファイル名をコードに書いてしまっているのは、Rustでコマンドライン引数をどう扱うのかは次の課題とするからだ。リファレンスのstd::ioの辺りを見ると、readlines相当はあるし、イテレータにlastというメソッドもある。サンプルコードを参考にしてそのまま書き写してみよう。lines.last());}もちろんエラーになる。Rustは低水準を扱うにもかかわらず、コンパイルが通ったらまず間違いなくメモリ操作を失敗しない、いわば厳しいC言語だ。コンパイルは通らない。--verbose.Rustのコンパイルエラーは近年まれに見るレベルの親切さだと思うが、だからといってどうしたらよいかわかるかは別の問題である。7行目は、要するにBufReader::new()の引数にstd::result::Resultを渡すのはダメだぞと言われている。この長ったらしい型はFile::openが戻しているわけだが、要するにファイルをopenすると「ファイルポインタかIOエラーかどちらかが返るよ」ということを1つの型として表している。std::ioのリファレンスを読むと、こういうときにはtry!マクロでくくってしまえば良いように思える。lines.last());}しかしながら、上手く行かない。crate「()を期待しているのに、Resultになってますけど?!」とおっしゃってる。空のタプルを期待しているのは誰だ?ひとしきり悩んでググってした結果、とあるサイトで「これはmain関数が戻り値なし(の場合、Rustは空タプルを戻すってことらしい)じゃないといけないのに、try!マクロの中にはエラーの時にreturnするようになっているのが原因」と書いてあった。この単純なスクリプトの場合、ファイルが開けなければ落ちてもらって構わない。その時には、エラーメッセージが親切にも教えてくれているように、unwrapしてしまえば良い。lines.last());}さて、次のエラーに取りかかろう。--verbose.なんと、last()が戻している型はstd::option::Option>である。