В Ruby 2.4 и для целых диапазонов Range(Enumerable)#sum
- это optimized, чтобы возвращать результат напрямую, без повторения всех элементов.Почему сумма Range # определена в Enumerable module?
Я не понимаю, почему соответствующий код определяется в enum.c
для Enumerable
модуля, а не в range.c
для Range
класса.
Почему Enumerable
знать о классах, которые включают его (например, Range
, Hash
, ...) и проверить их типа, вместо того, чтобы позволить эти классы перезаписать Enumerable#sum
?
замечен в enum.c
:
return int_range_sum(beg, end, excl, memo.v);
# or
hash_sum(obj, &memo);
Хороший вопрос. Для меня логичнее делать то, что вы предлагаете. –
.. потому что разработчики языка тоже ошибаются? Задать вопрос автору: https://github.com/ruby/ruby/commit/eb9c9964b08b980b05149ce91173204060917468 –
Я не говорю, что это неправильно, просто это удивительно. Там может быть вполне обоснованная причина (например, производительность). –