Ruby直到条件(直到排序,排序=真?)

时间:2013-05-26 12:32:21

标签: ruby conditional

有人可以解释这段代码吗?我从练习的解决方案部分得到它,所以它确实运行。为什么sorted未使用==进行比较,为什么sorted = false需要在sorted之后添加until

def bubble_sort(arr)
  sorted = false
  until sorted
    sorted = true
    (arr.count - 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

我原本希望代码是这样的:

sorted = false
until sorted == true do

但是,当我尝试用它替换它时,我收到以下错误:

eval):12: (eval):12: compile error (SyntaxError)
(eval):3: syntax error, unexpected kDO_COND, expecting kEND
    (arr.count - 1).times do |i|
                        ^
(eval):12: syntax error, unexpected kEND, expecting $end

这是收到错误的完整代码:

def bubble_sort(arr)
  sorted = false
  until sorted == true
    (arr.count - 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

2 个答案:

答案 0 :(得分:1)

我相信你最常将这个算法与Ruby语法混淆。

对于算法,您不能删除sorted = true之后的行until,因为您的循环永远不会结束,因为sorted永远不会变为真。

关于Ruby语法,您所写的内容是正确的,您可以编写until sorted的更长形式,即until sorted == true。您的问题是删除sorted = true,除非在if条件下再次变为false,否则会将其赋值为true。

答案 1 :(得分:0)

请勿混淆===。一个是赋值运算符,另一个是比较运算符。

sorted = false # sets initial value for a flag
until sorted # check if the flag is true at beginning of iteration
  # code that can change `sorted`
end

更新

在这种情况下,这两种形式是等效的。没有区别。两者都有效。

until sorted
until sorted == true