Почему Enumerable # each_with_object устарел? - PullRequest
12 голосов
/ 30 марта 2011

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

Ответы [ 3 ]

50 голосов
/ 30 марта 2011

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


Метод 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 |сумма + n} # => 55

10 голосов
/ 30 марта 2011

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

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

9 голосов
/ 30 марта 2011

Ну, это кажется немного странным. Даже Agile Rails где-то пишет: «Метод Ruby 1.9 each_with_object оказался настолько удобным, что команда Rails перенесла его в Ruby 1.8 для вас». Похоже на ошибку в apidock? Я не вижу причин, почему это будет: /

...