Объяснение неявных ошибок преобразования
Я не совсем уверен, почему ваш код получает эту ошибку, но я могу точно сказать, что означает эта ошибка, и, возможно, это поможет.
Тамв Ruby есть два вида преобразований: явные и неявные.
Явные преобразования используют короткое имя, например #to_s
или #to_i.
. Они обычно определяются вядро, и они называются все время.Они предназначены для объектов, которые не являются строками или не являются целыми числами, но могут быть преобразованы для отладки, перевода базы данных, интерполяции строк или чего-либо еще.
В неявных преобразованиях используется длинное имя, например #to_str
или #to_int.
.преобразования предназначены для объектов, которые очень похожи на строки или целые числа и просто должны знать, когда принять форму их альтер эго.Эти преобразования никогда не или почти никогда не определяются в ядре.(Хэл Фултон Ruby Way идентифицирует Pathname как один из классов, который находит причину для определения #to_str
.)
Довольно сложно получить вашу ошибку,Even NilClass
определяет явные (короткие имена) конвертеры:
nil.to_i
=> 0
">>#{nil}<<" # this demonstrates nil.to_s
=> ">><<"
Вы можете запустить его так:
Array.new nil
TypeError: no implicit conversion from nil to integer
Следовательно, ваша ошибка исходит из кода C внутри интерпретатора Ruby.Базовый класс, реализованный в C, получает nil
, когда он ожидает Integer
.Он может иметь #to_i
, но не имеет #to_int
, поэтому результатом является TypeError.