2015-03-04 4 views
0

Я пытаюсь выполнить итерацию по массиву с помощью a для каждого цикла в ruby, но внутри цикла я увеличиваю размер массива условно. Я хочу, чтобы перебирать массив, пока я не запускать итерацию с каждым элементом в массиве, включая все те, которые я добавилдля каждого цикла с увеличением массива

for x in fol 
    t = get_transition(x,"") 
    for i in t 
     if i != nil && !fol.include?(i) 
      fol = fol.push(i) 
      fol = fol.flatten 
     end 
    end 
end 

В первом цикле этого кода массив

fol = [1] 

и это добавляет элемент 3 в массив, создающего

fol = [1, 3] 

он будет затем запустить цикл снова с х = 3 и массив становится

fol = [1, 3, 2] 

Но он не будет снова перебирать с х = 2. Заранее спасибо за любую помощь

В целях разъяснения я добавил в операторах печати и вывода, которые они производят.

fol.each do |x| 
    puts "fol = #{fol}" 
    puts "x = #{x}" 
    t = get_transition(x,"") 
    puts "t = #{t}" 
    t.each do |i| 
     puts "i = #{i}" 
     if i != nil && !fol.include?(i) 
      fol = fol.push(i) 
      fol = fol.flatten 
     end 
    end 
end 

puts "\nfol = #{fol}" 

Этот код генерирует этот выход

fol = [1] 
x = 1 
t = [3] 
i = 3 
fol = [1, 3] 
x = 3 
t = [2] 
i = 2 

fol = [1, 3, 2] 
+0

Как это происходит от '[1,3]' до '[1,3,2]' когда 'x = 3'? Что вы имеете в виду, «он не будет повторять снова с x = 2»? Было бы полезно, если бы вы могли (отредактировать) дать пример для 'get_transition' и связанного с ним желаемого вывода. –

+0

@CarySwoveland Я думаю, что 2 добавляется в 'x = 3' итерации' fol.push (i) '. Проблема в том, что он не продолжает итерацию 'x = 2'. – Max

+1

Я должен добавить, что этот код очень запутан, особенно тот, в котором вы переназначаете 'fol' внутри цикла. Для полной переписки требуется полная идиоматичность, но я не могу сказать из контекста, что вы пытаетесь сделать. – Max

ответ

3

Я пытаюсь итерации через массив, используя для каждого цикла в рубин но внутри петли я увеличивая размер массива условно. Я хочу, чтобы перебирать массив, пока я не запускать на итерацию с каждым элементом в массиве, включая все те, которые я добавил

Почему бы не только рассматривать это как очередь? Это в значительной степени то, что вы описали

queue = fol.clone 
until queue.empty? 
    x = queue.pop 
    t = get_transition(x,"") 
    for i in t 
    if i != nil && !fol.include?(i) 
     # Not too sure what type "i" is here, but you push onto the queue here 
     # I'd try to avoid flattening if you know what your data types are as it will be slow 
    end 
    end 
end 
+0

Спасибо, что это сработало отлично. Точно, что мне нужно – user2823747

Смежные вопросы