В ruby / rails как мне создать этот помощник для общего цикла?

#ruby-on-rails #ruby #helpers

#ruby-on-rails #ruby #помощники

Вопрос:

Я все время пишу этот фрагмент кода, он сравнивает два ожидаемых значения из одного и того же массива, если они являются одним и тем же элементом:

 items.each_with_index do | x, i |
    items.each do | y, j |
        if x.id != y.id
            #... do some things
        end
    end
end
  

Что я действительно хотел бы написать, так это:

 items.compare_each do | x, y, i, j |
    #... do some things
end
  

Как бы вы написали помощник, который в ruby / rails? Или даже он уже существует?

Комментарии:

1. Не могли бы вы предоставить немного больше контекста? Что такое items и как вы используете этот цикл?

2. Я вижу только один массив, items … обычно ли цикл предназначен для одного массива?

3. Items — это просто любой набор записей, но все они имеют идентификатор. Да, извините, он сравнивает один и тот же массив с самим собой.

Ответ №1:

Предполагая, что вы пытаетесь сравнить каждый элемент в одном массиве с любым другим элементом в этом массиве, как показывает ваш пример кода (вместо сравнения двух массивов друг с другом, как указано в вашем тексте), вы хотите Array#combination , возможно, в сочетании с Enumerable#each_with_index , если индексация важна:

 %i{a b c d e}.each_with_index.to_a.combination(2) {|(x,i),(y,j)| p [x,y,i,j] }
[:a, :b, 0, 1]
[:a, :c, 0, 2]
[:a, :d, 0, 3]
[:a, :e, 0, 4]
[:b, :c, 1, 2]
[:b, :d, 1, 3]
[:b, :e, 1, 4]
[:c, :d, 2, 3]
[:c, :e, 2, 4]
[:d, :e, 3, 4]
=> [[:a, 0], [:b, 1], [:c, 2], [:d, 3], [:e, 4]]
  

В приведенном выше примере также используется деструктурирование аргументов.