はてなインターンの事前課題をCrystalでやった
さいしょに
この記事はCrystal Advent Calendar 2016 4日目の記事.空いていたので後から参加.
最近Crystalをやっている.そのときに id:shiba_yu36 さんの以下の記事を見て良さそうだったのでCrystalでもやってみた.
リポジトリはこちら.
ファイル操作,日付操作,コレクション操作,エラーハンドリング,テスト周りを触ることができて良かった.
ファイル操作
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みたいなのないのかな.いい方法知りたい.
例外も自分で定義して返す感じ?
それで呼び出し元でも begin~rescue
する感じなのかな.よくわからん...
そこらへんRubyとか例外機構があるプログラミング言語の資料でも読めば良さそう.
テスト
うーむ. Spec.before
使おうとしたけど失敗したりしたw 普通に使えるハズだけどな...
テストは普通に should eq()
の組み合わせで愚直に比較していった.もっと良いやりかたあるのかな?
describe
もどういう単位で分けていけばいいのか分からん.
あと,公式の言語のテストを見ると,メソッドをどういう感じで利用するのか参考にできて良かった.
感想
namespace
っていうやつ,どんな感じでわければいいのかわからん.Rubyもやってこなかったので... あと,例外処理とテストがこれでいいんだろうかみたいなのがあって,テストはもっとうまくかけそうな気がする...
いろんなトピックを一度に扱えてよかった.
はてなインターン最高.