#ruby #enumerable #ruby-1.9 #ruby-1.8.7
#ruby #enumerable #ruby-1.9 #ruby-1.8.7
Вопрос:
В Ruby 1.8.7 и предыдущих Enumerable::each_with_index
версиях не принимал никаких аргументов. В Ruby 1.9 он будет принимать произвольное количество аргументов. Документация / код показывает, что он просто передает эти аргументы вместе ::each
. Я полагаю, что передача аргумента со встроенными и стандартными перечислимыми библиотеками приведет к ошибке, поскольку метод Enumerable ::each
не ожидает параметров.
Так что я бы предположил, что это полезно только при создании вашего собственного Enumerable, в котором вы создаете ::each
метод, который принимает аргументы. Какой пример, где это было бы полезно?
Существуют ли какие-либо другие неочевидные последствия этого изменения?
Ответ №1:
Я просмотрел некоторый код gems и почти не нашел использования этой функции. Тот, который он делает, spreadsheet
:
def each skip=dimensions[0], amp;block
skip.upto(dimensions[1] - 1) do |idx|
block.call row(idx)
end
end
Я действительно не рассматриваю это как важное изменение: #each
является ли базовый метод для классов, которые смешивают в модуле, перечислимым, а добавленные методы (map, select, …) не принимают аргументы.
Комментарии:
1.
each_with_object
принимает аргументы. Надеюсь, я не слишком спорный!2. @Andrew, но each_with_object — это скрытая инъекция, поэтому вполне естественно, что вам нужен аргумент. Однако я должен признать, что я не совсем уверен во всем этом, независимо от того, важны ли (или будут важны) аргументы для каждого или просто незначительная деталь. На мой вкус, в любом случае, каждый — будучи базовым итератором — не должен принимать никаких аргументов.
3. Одно из различий между
reduce
иeach_with_object
заключается в том, что только последний возвращает перечислитель, когда блок не задан. Разве это не существенная разница?