Ruby块适用于{},但不适用于do ... end

时间:2018-12-28 15:32:07

标签: ruby

我试图实现一个冒泡排序方法,该方法接受一个块并返回以升序排序的数组。 由于某些原因,我无法理解使用{}时得到正确的结果,但是使用do ... end时出现错误“未给出块”。

代码如下:

def bubble_sort_by(arr)
  return arr if arr.size == 1
  swapped = true

  while swapped
    swapped = false
    (0...arr.size - 1).each do |index|
      block_result = yield(arr[index], arr[index + 1])
      # binding.pry
      if block_result >= 1
        arr[index], arr[index + 1] = arr[index + 1], arr[index]
        swapped = true
        # binding.pry
      end
    end
  end
  arr
end

p bubble_sort_by(["hi","hello","heys"]) do |left,right|
left.length - right.length 
end
#the code returns ["hi", "heys", "hello"] when the block is passed with { }

我们将不胜感激。

1 个答案:

答案 0 :(得分:10)

优先级很重要。

{}具有几乎最高的优先级,并且在功能应用程序之前 (在p()调用之前)执行。

do end OTOH的优先级几乎是最低的,并且是在 函数应用程序之后(在p()调用之后)执行的。

放置括号以避免产生歧义:

p(bubble_sort_by(["hi","hello","heys"]) do |left,right|
  left.length - right.length 
end)

在您的原始示例中,执行顺序如下:

p(bubble_sort_by(["hi","hello","heys"])) do ... end

基本上,您一直在使用参数块调用p