ものづくりのブログ

うちのネコを題材にしたものづくりができたらいいなと思っていろいろ奮闘してます。

Crystal ユニオン型で演算処理

Ruby ライクなプログラミング言語 crystal について勉強してます。
今回は Crystal でユニオン型の変数について演算を行う際に苦労したので、ここにメモを残します。
REPL の icr で検証してみました。

まずはユニオン型の変数(a)を作ります。

icr(0.33.0) >   if 1 + 2 == 3
icr(0.33.0) >      a = 1
icr(0.33.0) >   else
icr(0.33.0) >     a = nil
icr(0.33.0) >   end

確認方法は以下の通り。

icr(0.33.0) > typeof(a)
 => (Int32 | Nil)

この状態で演算処理を行うとエラーになります。

icr(0.33.0) > a + 1
Showing last frame. Use --error-trace for full trace.

In .icr_f8iCCPDfIY8Y-uKfNlHT0w.cr:46:5

 46 | a + 1
        ^
Error: undefined method '+' for Nil (compile-time type is (Int32 | Nil))
icr(0.33.0) >

Nil の場合が考慮されていないためエラーになるようです。

nil を除外すると演算が可能となるようです。

icr(0.33.0) > a + 1  if !a.nil?
 => 2

ユニオン型は、設定しているすべての型がメソッドに応答する必要があるようです。
対応していない場合は、コンパイル時にエラーが発生するので注意したいと思います。