Array#count
не является ошибочным методом, Enumerator#count
- это:
100000.times.to_a.combination(2).class # => Enumerator
Хорошая новость заключается в том, что ошибка, с которой вы столкнулись, была зарегистрирована несколько месяцев назад как # 14805 и впоследствии исправлено, но плохие новости с тех пор не было выпущено никакой новой версии CRuby.Так что либо дождитесь 2.5.2, 2.4.5 и т. Д., Либо скомпилируйте версию с исправлением самостоятельно.
Проблема в том, что счетчик перечислителя ограничен 32-разрядным целым числом со знаком, поэтомупроизошло переполнение:
max = (1 << 31) - 1 # max value
4999950000 & max # => 704982704
Это было исправлено путем создания счетчика bignum (целочисленный тип произвольной точности Ruby, так как 2.4 - внутренняя деталь реализации) в случае, если его значение выходит за пределы int
илина данный момент unsigned long
.