Учитывая следующее:Число в массиве не типизировано как целое?
def test(arr)
cache = []
for i in 0..arr.length
if !cache[arr[i]] # no implicit conversion from nil to integer
cache[arr[i]] = true
end
if !cache[arr[i]].to_i # no implicit conversion from nil to integer
cache[arr[i]] = true
end
if !cache[arr[i].to_i] # works fine
cache[arr[i]] = true
end
end
end
puts test([1, 5, 8, 11])
Почему cache[arr[i]]
требует to_i
преобразования? От this answer
Ваша ошибка исходит из кода C внутри интерпретатора Ruby. Основной класс, реализованный на C, получает ноль, когда ожидает Integer. Он может иметь #to_i, но он не имеет #to_int, поэтому результатом является TypeError.
Я не вижу, как преобразование arr[i].to_i
решает проблему, так как arr[i]
уже является целым числом?
Я не могу согласиться с первым предложением. Проблема не имеет ничего общего с 'for' или ее неправильным использованием, это простая ошибка за один раз. Нет ничего * неправильного * с использованием 'for' или того, как он использует' for', он просто отговаривается в пользу '.each' * по соглашению *. Он столкнулся бы с той же проблемой, если бы использовал '(0..arr.length) .each do | i |' вместо использования 'for'. – meagar
@meagar Я имею в виду использование 'for' в классическом смысле * приглашает * по очереди ошибки. Я не знаю, сколько битов кода C или C++ я видел с такими проблемами точно так же. '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'тоже безопасно. – tadman
'for' также может быть надежным, и он абсолютно не требует ошибок при использовании правильно, так же, как' .each'. Если бы он использовал 'for i in arr', все было бы в порядке. Я полностью согласен с тем, что '.each' на сегодняшний день является более идиоматическим способом повторения перечислимого числа, но я по-прежнему не согласен с обвинениями в' 'для проблем здесь. – meagar