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

下面的代码给出了一个错误:

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 

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

但是,Ruby 1.8.7 正式退役 ,在我看来,Codecademy Labs网站也不再需要维护,所以我建议学习Ruby使用“完整” Codecademy网站,或安装更新版本的Ruby(我在本地推荐2.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 

我已经用你的链接测试了它,所以我猜它可能没有正确配置,因为当我第一次添加total时,它变成了无限循环。 但有人必须检查它反对ruby,它可能是一个错误。

在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]