2014-11-10 6 views
0

Вопрос: с первой строкой в ​​цикле «до» мы устанавливаем логическое, отсортированное и истинное. Почему цикл работает даже после этой строки? Также почему мы не можем поместить sorted = true после цикла .times do (чтобы закрыть цикл до сортировки) и добиться того же результата?До тех пор, пока цикл - почему он не выходит сразу?

def bubble_sort(arr) 
    len = arr.length 
    sorted = false 
    until sorted 
    sorted = true 
    (len-1).times do |i| 
     if arr[i] > arr[i+1] 
     arr[i],arr[i+1] = arr[i+1],arr[i] 
     sorted = false 
     end 
    end 
    end 
    arr 
end 

Заранее благодарен!

+0

Попробуйте следующее: 'lives = 1; пока жизнь == 10 не сделает; ставит «Остерегайтесь!»; (lives == 9)? puts («Эгад! У меня было девять!»): puts («Уйу, это было близко, это номер # {lives}»); жизни + = 1; конец; ставит «Meooowwwww». –

+0

До тех пор пока и не очень тесно связаны, но я думаю, что они расходятся в последнее время. Переведенный здесь опыт не соответствует таковому в [документации] (http://ruby-doc.org/docs/keywords/1.9/files/keywords_rb.html#M000038). Если условный оператор является ложным, согласно документации, он не должен обрабатывать блок. То есть, если это не форма модификатора, как в форме «begin..end до false». – vgoff

ответ

4

Условие цикла проверяется в начале каждой итерации через петлю. Значение sorted внутри тела цикла не имеет значения, все, что имеет значение, - это значение sorted, когда цикл вот-вот начнет новую итерацию. Цикл не смотрит sorted, чтобы увидеть, когда изменяется его значение, он просто оценивает sorted перед каждой итерацией и останавливает цикл, когда он правдивый (т. Е. Не false, а не nil), когда он проверен.

+0

Спасибо, я понял! sorted = true по умолчанию, если нет отдельного номера. – jyim

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