2016-12-25: Array#concatが和型を受け取れるようにしたり、あきゆめくくるを始めたり
そういやエリナー・リグビー聴いてないな。
やったこと
Array#concatが和型を受け取れるようにした
Fix to concat a union of arrays by MakeNowJust · Pull Request #3775 · crystal-lang/crystal
どういう意味なのかというと、例えばこういう配列があったとする。
arr = [1, '2']
この配列の型は当然Array(Int32 | Char)だ。
そして、こういう引数でconcatする際には上手く動作する。
# Array(Int32)
arr.concat([3])
# Array(Char)
arr.concat(['4'])
# Array(Int32 | Char)
arr.concat([5, '6'])
しかし、この場合には上手くコンパイルできない。
# Array(Int32) | Array(Char)
arr.concat([7] || ['7'])
なぜかというと、内部でArray(Int32) | Array(Char)がPointer(Int32) | Pointer(Char)になって、最終的にPointer(Void)にキャストされようとするのだけど、ポインタの和型は任意のポインタにキャストできるわけではないのでエラーになる。これは挙動としては正しいので、どうにかしてconcatの引数が和型になるのを防がなければいけない。
そのために、新しくArray#concat_toというメソッドを作って、concatの内部ではそれを呼ぶようにした。こうすることで和型の各型がばらされて呼び出される形になる。この方法を思い付いたときには結構感動した。
あきゆめくくるを始めた
買ってきたしやろうと思ってインストールした。普通に楽しいじゃん、という感じ。まだ1ルートも終わってないので何とも言えないけど。