これは「Ruby脳にはCrystalつらい Advent Calendar 2015」の1日目の記事です。
Ruby だと配列の範囲外に値を代入すると、
array = [0, 1, 2] array[4] = 4 array #=> [0, 1, 2, nil, 4]
のように、配列が自動拡張されるのですが、Crystal で同じことをすると例外が発生してつらい。
% crystal a.cr Index out of bounds (IndexError) [4346711] *CallStack::unwind:Array(Pointer(Void)) +87 [4346602] *CallStack#initialize<CallStack>:Array(Pointer(Void)) +10 [4346554] *CallStack::new:CallStack +42 [4355503] *Exception +31 [4355437] *IndexError#initialize<IndexError, String>:CallStack +29 [4355377] *IndexError::new<String>:IndexError +97 [4355269] *IndexError::new:IndexError +21 [4342002] *Array(Int32) +98 [4341863] *Array(Int32) +39 [4332833] ??? [4339872] main +32 [139940759222848] __libc_start_main +240 [4330009] _start +41 [0] ???
ちゃんとひとつずつ値を追加するようにしましょう。
array = [0, 1, 2] array.push 3 array.push 4 array #=> [0, 1, 2, 3, 4]