Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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 похоже, путается методом миграции между проектами.