読者です 読者をやめる 読者になる 読者になる

mrubyでFile::Statつくった

https://github.com/ksss/mruby-file-stat

mrubyでFile.mtime('file')としようと思ったらmruby-ioでも実装されていなかった。

そういえばファイルに関する情報をいろいろと取得したいのならC的にはstat(2)を使えばいいっぽい。

これをラップしたオブジェクトはCRubyにはすでにあり、File::Statがあるらしい。

File.mtimeも結局はstat(2)を呼んでファイルに関する情報の一部をとっているだけのようだ。

File::Statはmruby界にはまだなく(誰も欲しがってない?)、mtimeが使いたいのでFile::Statクラスを実装してみた。

僕のファイルシステムに関する知識はほぼ皆無で「実ユーザーってなんだよ」ぐらいの初心者レベルだ。(world_readalbe?なんか本気でわからないので実装していない。)

とりあえずCRubyのコードを沢山コピペしたらそれとなくできた。

参考: https://github.com/ruby/ruby/blob/trunk/file.c

肝心のmtimeはCRubyではTimeオブジェクトを返すらしい。僕の乏しい知識では何故そうするのかよくわからない。time_tだからからかなあ。あとCRubyのコードを見ていると、ミリ秒単位もOSがサポートしていれば使えるようになっているみたいだった。僕の知らないシビアな世界もあるようだ。

問題はmrubyはCRubyの仕様に完全沿うべきかどうかだ。

実際どうなっているかというと、違いはチョコチョコある。できるだけ少メモリーで動かしましょうといった時に、Cを主体としたスクリプトを作りましょうといった時に、時間が知りたいからTimeオブジェクトを新しく作って返そう!が正解か、st_mtimeの数字をそのまま返そう!が正解か、僕にはわからないけど、メモリが少なそうな数字をそのまま返す方をとってみた。

ここまで書いてみてmrubyの数字は幅が可変だしTimeの方がいいのかも……と思いだしてきた。うーーーん。

そうだ、PRをまとう!

https://github.com/ksss/mruby-file-stat

それはさておきmrubyの拡張ライブラリを書いてみて思ったこと。

  • 少メモリを謳っているのならメソッドはできるだけ少ない方がいいのかなあ。でも今って機能拡張しているんだよなあ。
  • trueかfalseを返すとき、いちいちexpr ? mrb_true_value() : mrb_false_value()みたいに書かないといけないのがめんどくさい。BOOL(expr)とかどうかなあ。
  • iijさんのようにCのコードは最低限にして、Rubyで書けるならRubyで書いたほうが楽だしAPIも変わらないから保守性も良さそうだなあ。
  • Data_Make_Structって使ってる人いるのかなあ。
  • mrubyって使ってる人いるのかな。

おわり。