我试图实现一个冒泡排序方法,该方法接受一个块并返回以升序排序的数组。 由于某些原因,我无法理解使用{}时得到正确的结果,但是使用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 { }
我们将不胜感激。
答案 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
。