Enumerable ::each_with_index теперь необязательно принимает аргументы в Ruby 1.9. Какое значение и / или какой вариант использования для этого?

#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 заключается в том, что только последний возвращает перечислитель, когда блок не задан. Разве это не существенная разница?