人権真骨頂

とくがたかいことでゆうめい

はてなインターンの事前課題をCrystalでやった

さいしょに

この記事はCrystal Advent Calendar 2016 4日目の記事.空いていたので後から参加.

qiita.com

最近Crystalをやっている.そのときに id:shiba_yu36 さんの以下の記事を見て良さそうだったのでCrystalでもやってみた.

blog.shibayu36.org

リポジトリはこちら.

github.com

ファイル操作,日付操作,コレクション操作,エラーハンドリング,テスト周りを触ることができて良かった.

ファイル操作

File - github.com/crystal-lang/crystal

ここ見てやってた. File.read_lines だけで今回は困ることがなくて良かった.

日付操作

Time - github.com/crystal-lang/crystal

日付操作も今回は,epoch秒を Time クラスに変換して. 決められたフォーマットで出力するだけで良さそうだったので楽だった.

Time.epoch(123456789).to_s("%Y-%m-%dT%H:%M:%S")

こんな感じでできた.

コレクション操作

Enumerable(T) - github.com/crystal-lang/crystal

ここを参考にしながら,自分のScala実装を見て移植していった感じ.ScalaとCrystalでは同じ動作をするメソッドでも名前が違うのがあるので戸惑ったりした.(filter->select とか) そこらへんはRuby由来な感じ?

他にもScalaみたいな感じで,

logs.map(_.status) ってやりたいけど, logs.map { |log| log.status } ってやる感じになって不便.

エラーハンドリング

めっちゃ難しい.自分はGoの返り値でエラー返すやつに慣れているので,そもそも例外機構自体新鮮だった. begin~rescue で囲む感じで良いのかな.

でもここは囲むのが長い感じがする.Optionalみたいなのないのかな.いい方法知りたい.

https://github.com/upamune/crystal-Intern-Exercise/blob/master/src/crystal-Intern-Exercise/ltsv_parser.cr#L15-L33

例外も自分で定義して返す感じ?

https://github.com/upamune/crystal-Intern-Exercise/blob/master/src/crystal-Intern-Exercise/ltsv_parser.cr#L39-L49

それで呼び出し元でも begin~rescue する感じなのかな.よくわからん...

そこらへんRubyとか例外機構があるプログラミング言語の資料でも読めば良さそう.

テスト

うーむ. Spec.before 使おうとしたけど失敗したりしたw 普通に使えるハズだけどな...

テストは普通に should eq() の組み合わせで愚直に比較していった.もっと良いやりかたあるのかな?

describe もどういう単位で分けていけばいいのか分からん.

あと,公式の言語のテストを見ると,メソッドをどういう感じで利用するのか参考にできて良かった.

感想

namespace っていうやつ,どんな感じでわければいいのかわからん.Rubyもやってこなかったので... あと,例外処理とテストがこれでいいんだろうかみたいなのがあって,テストはもっとうまくかけそうな気がする...

いろんなトピックを一度に扱えてよかった.

はてなインターン最高.