Итак, я использовал некоторые тесты в Ruby 2.4.0 и понял, что
(1...1000000000000000000000000000000).sum
рассчитывается немедленно, тогда как
(1...1000000000000000000000000000000).inject(:+)
занимает так много времени, что я просто прервал операцию. У меня создалось впечатление, что Range#sum
был псевдонимом для Range#inject(:+)
, но похоже, что это неверно. Итак, как работает sum
и почему это происходит намного быстрее, чем inject(:+)
?
N.B. Документация для Enumerable#sum
(которая реализована Range
) ничего не говорит о ленивой оценке или о том, что происходит по этим строкам.