【问题标题】:Ruby block works with { } but not with do...endRuby 块适用于 { } 但不适用于 do...end
【发布时间】:2018-12-28 23:48:49
【问题描述】:

我试图实现一个冒泡排序方法,该方法接受一个块并返回按升序排序的数组。 出于某种我无法理解的原因,当我使用 { } 时我得到了正确的结果,但是当我使用 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 { }

任何帮助将不胜感激。

【问题讨论】:

  • 如果给出的唯一答案令人满意(根据您留下的评论似乎是这种情况),您应该选择它作为首选答案(通过单击答案旁边的复选标记)。由于您的声誉超过 14,您也可以根据需要投票。

标签: ruby


【解决方案1】:

优先级很重要。

{} 几乎具有最高优先级,并在 函数应用程序之前执行(在 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,并带有一个参数一个块。

【讨论】:

  • 非常感谢您的详尽回答!我试过了,它按预期工作。
猜你喜欢
  • 2014-01-29
  • 2018-04-12
  • 2016-05-20
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 2016-02-28
  • 2020-03-16
  • 2014-05-14
相关资源
最近更新 更多