2015-05-01 2 views
1

Я пытаюсь реализовать функцию поиска, которая ищет вхождение для определенного keyword, но если указаны параметры --max, он будет печатать только определенное количество строк.Как остановить внешний блок из внутреннего блока

def search_in_file(path_to_file, keyword) 
    seen = false 
    File::open(path_to_file) do |f| 
    f.each_with_index do |line, i| 
     if line.include? keyword 

     # print path to file before only if there occurence of keyword in a file 
     unless seen 
      puts path_to_file.to_s.blue 
      seen = true 
     end 

     # print colored line 
     puts "#{i+1}:".bold.gray + "#{line}".sub(keyword, keyword.bg_red) 


     break if i == @opt[:max] # PROBLEM WITH THIS!!! 

     end 



    end 
    end 
    puts "" if seen 
end 

Я пытаюсь использовать break заявление, но когда оно находится в пределах блока if ... end я не могу выйти из внешнего each_with_index блока.

Если я переведу break за пределами if ... end, это работает, но это не то, что я хочу.

Как я могу справиться с этим?

Заранее спасибо.

+1

Почему вы не хотите, чтобы переместить, что 'сломаться, если я == @opt [макс]' линейный выход, если 'if' блок? Кстати, у вашей текущей реализации есть проблема, что она не останавливается, если строка с номером '@opt [: max]' не включает ключевое слово. Вы все равно должны это изменить. – spickermann

+0

Дело в том, чтобы проверить только линии, где обнаружено место, и остановиться, когда достигнут максимум. Если я сделаю это по-своему, он будет считать всю строку, например 10, и останавливается. То, что я хочу, - это подсчет строк только с появлением. – SuperManEver

+0

@spickermann Ваш комментарий косвенно указал мне на то, где настоящая проблема. На самом деле, я делаю сравнение с неправильной переменной – SuperManEver

ответ

1

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

def search_in_file(path_to_file, keyword) 
    seen = false 
    catch :limit_reached do 
    #put your code to look in file here... 
    throw :limit_reached if i == @opt[:max] #this will break and take you to the end of catch block 

Нечто подобное уже существует here

+0

На самом деле проблема была не в том, как я вырвался из блока, а с того, как я рассчитываю линии и проверяю условие на разрыв. – SuperManEver

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