为什么直到Ruby中的这种用法不起作用,而另一种用法呢?

时间:2013-07-19 19:57:09

标签: ruby block

以下代码会出错:

def bubble_sort(arr)
  until arr == arr.sort do
    (arr.count - 1).times do |i|
      (arr[i], arr[i + 1] = arr[i + 1], arr[i]) if (arr[i] > arr[i + 1])
    end
  end 

  arr
end

(eval):433:(eval):433:编译错误(SyntaxError)

(eval):426:语法错误,意外的kDO_COND,期待kEND     (arr.count - 1).times do | i |                             ^

(eval):433:语法错误,意外的kEND,期待$ end

但下面的另一个变体成功通过。为什么呢?

def bubble_sort(arr)
  begin
    (arr.count - 1).times do |i|
      (arr[i], arr[i + 1] = arr[i + 1], arr[i]) if (arr[i] > arr[i + 1])
    end
  end until arr == arr.sort

  arr
end

3 个答案:

答案 0 :(得分:0)

我不知道为什么,但如果您将第一个代码更改为以下代码,它将会解决:

def bubble_sort(arr)
  total = (arr.count - 1)
  until arr == arr.sort do
    total.times do |i|
      (arr[i], arr[i + 1] = arr[i + 1], arr[i]) if (arr[i] > arr[i + 1])
    end
  end 

  arr
end

我已经使用您的link对其进行了测试,所以我猜测可能没有正确配置,因为当我第一次在total中添加until时,它变成了无限循环。但有人必须检查它反对ruby,这可能是一个错误。

答案 1 :(得分:0)

经过一些调试后,这看起来像是1.8.7上的irb中的一个错误(labs.codecademy.com使用的版本)。在本地,当安装Ruby 1.8.7-p374时,我看到同样的事情。但是,如果我将代码作为普通的Ruby文件运行,它就可以正常工作。

然而,Ruby 1.8.7是officially retired,在我看来,Codecademy Labs网站也不再需要维护,所以我建议学习Ruby并使用“完整”Codecademy站点,或在本地安装更新版本的Ruby(我推荐2.0.0)。

答案 2 :(得分:-1)

在Ruby中,until块不使用do,所以你应该这样做:

def bubble_sort(arr)
  until arr == arr.sort
    (arr.count - 1).times do |i|
      (arr[i], arr[i + 1] = arr[i + 1], arr[i]) if (arr[i] > arr[i + 1])
    end
  end 

  arr
end

修改:扩展代码,使其包含原始问题的算法。此代码适用于ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-darwin12.4.0]