В соответствии с ApiDock метод Ruby Enumerable#each_with_object
устарел. Если он не ошибается (заявив, что "устарел на последней стабильной версии Rails", вызывает у меня подозрение, что, возможно, это устаревшая обезьяна Rails, которая устарела), почему она устарела?
Почему Enumerable # each_with_object устарел?
Ответ 1
Ну, это кажется немного странным. Даже Agile Rails пишет где-то: "Метод Ruby 1.9 each_with_object оказался настолько удобным, что команда Rails обратила его в Ruby 1.8 для вас". Похоже на ошибку в apidock? Я не вижу причин, почему это было бы:/
Ответ 2
Это скорее ответ на отрицание предпосылки вашего вопроса, а также для того, чтобы убедиться, что это такое.
Метод 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
Ответ 3
В исходном коде строки Ruby нет заметки, метод все еще существует (в отличие от этой страницы), и об этом не было в списке рассылки, который я могу найти.
APIdock просто путают. Точка, в которой APIdock говорит, что она была устаревшей, на самом деле является самой ранней версией с методом в стандартной библиотеке (а не просто расширением backport ActiveSupport), а Rails отключает ее версию, если вы используете Ruby с таким методом, поэтому APIdock похоже, путается методом миграции между проектами.