Читаю про строковые операции - мозг взрывает покруче, чем в JavaScript.
str[start, length] > new_str or nil
For the start and range cases the starting index is just before a character and an index matching the string’s size.
http://ruby-doc.org/core-2.2.2/String.html
Иными словами, первый символ в строке, он даже не нулевой, а минус первый. Хотя, помня, что автор - японец...