Почему Enumerable#each_with_object устарел?

Согласно APIdock, метод Ruby Enumerable#each_with_object устарел.

Если это не ошибка (говорение «устарело в последней стабильной версии Rails» заставляет меня подозревать, что, возможно, это устарело исправление обезьяны Rails), почему оно устарело?


person Andrew Grimm    schedule 30.03.2011    source источник


Ответы (3)


Что ж, это кажется немного странным.

Даже Agile Rails где-то пишет:

«Метод Ruby 1.9 each_with_object оказался настолько удобным, что команда Rails перенесла его для вас в Ruby 1.8».

Это похоже на ошибку в APIdock? Я не вижу причин, почему это было бы так.

person Spyros    schedule 30.03.2011
comment
Согласен, это действительно удобно. Если он устарел, я просто добавлю свой собственный к каждому Ruby, который я найду! :) - person iain; 30.03.2011
comment
Забавно, кажется, я только что прочитал это в книге 1.9 Pick Axe на днях. - person Clint Pachl; 02.11.2012

Это скорее ответ на опровержение предпосылки вашего вопроса, а также для того, чтобы убедиться, что она есть.


Метод each_with_object избавляет вас от дополнительных нажатий клавиш. Предположим, вам нужно создать хэш из массива. С inject вам нужен дополнительный h в:

array.inject({}){|h, a| do_something_to_h_using_a; h} # <= extra `h` here

но с each_with_object вы можете сохранить этот ввод:

array.each_with_object({}){|a, h| do_something_to_h_using_a} # <= no `h` here

Поэтому хорошо использовать его всякий раз, когда это возможно, но есть ограничение. Как я также ответил в "Как группировать по количеству в массиве без использования цикла",

  • Если начальный элемент является изменяемым объектом, например Array, Hash, String, вы можете использовать each_with_object.
  • Когда начальный элемент является неизменяемым объектом, таким как Numeric, вы должны использовать inject:

    sum = (1..10).inject(0) {|sum, n| sum + n} # => 55
    
person sawa    schedule 30.03.2011
comment
+1 - Спасибо за разъяснение разницы между each_with_object и inject! - person Topher Fangio; 14.02.2013
comment
Согласно этому источнику, each_with_object делает больше, чем просто сохраняет нажатия клавиш, на самом деле это более эффективная версия inject, потому что он повторно использует один и тот же объект для каждой итерации, а не создает новый. - person Peter Berg; 18.08.2014
comment
Вы понимаете, что во второй версии есть 7 дополнительных символов, верно? поэтому, когда вы говорите, что each_with_object экономит нажатия клавиш, я ожидаю, что во второй версии будет меньше символов. Не тот случай. - person Cosmin Atanasiu; 24.08.2017
comment
@CosminAtanasiu сохранять нажатия клавиш - это ваше слово, а не мое. - person sawa; 25.08.2017

В исходном коде ствола Ruby нет примечания, метод есть до сих пор (вопреки утверждениям на этой странице), и в списке рассылки, который я могу найти, о нем ничего не говорилось.

APIdock просто запутался. Точка, в которой APIdock говорит, что он устарел, на самом деле является самой ранней версией с методом в стандартной библиотеке (а не просто расширением резервного порта ActiveSupport), и Rails отключает его версию, если вы используете Ruby, у которого есть метод, поэтому APIdock кажется, смущает метод миграции между проектами.

person Chuck    schedule 30.03.2011