【问题标题】:Why does this usage of until in Ruby not work, while another usage does?为什么直到在 Ruby 中的这种用法不起作用,而另一种用法却起作用?
【发布时间】:2013-07-19 05:37:31
【问题描述】:

下面的代码报错:

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

【问题讨论】:

  • 错误在其他地方......两者都对我有用
  • 我正在使用 Codecademy 的网络解释器...
  • 你正在从那里学习它的好处。除了安装一个 ruby​​ 版本和任何编辑器。尽可能多地在你的个人机器上练习......
  • 你真的认为这个问题是关于冒泡排序的吗?它不是。它与冒泡排序无关。
  • @Borodin OP 将其标记为冒泡排序。我看到很多问题都被标记为问题中出现但根本不重要的某个单词。我真的很想知道这些人在想什么。

标签: ruby block


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    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 对其进行了测试,所以我猜它可能没有正确配置,因为当我第一次在until 中添加total 时,它变成了一个无限循环。但是必须有人根据 ruby​​ 来检查它,这可能是一个错误。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多