如何使用块作为方法输入

时间:2016-07-13 22:32:49

标签: ruby

我正在尝试创建一个使用bubble-sort将小数组按数字顺序排序的方法。此方法接受两个参数,一个数组和一个方法:

def bubble_sort_by(arr)
    while(true)
        counter = 0
        for i in 0...(arr.size-1)
            if yield (arr[i], arr[i+1]) > 0
                saved = arr[i]
                arr[i] = arr[i+1]
                arr[i+1] = saved
                counter += 1
            end
        end
        if (counter == 0)
            break
        end
    end

    print arr
end

bubble_sort_by([4,3,78,2,0,2]) do |left,right|
    return left - right
end

排序的数组应该是

[0,2,2,3,4,78]

目前我使用的是Ruby版本2.3.0p0。

当我尝试运行此代码时,我一直收到语法错误。

1 个答案:

答案 0 :(得分:1)

这是固定版本:

 def bubble_sort_by(arr)
    while(true)
        counter = 0
        for i in 0...(arr.size-1)
            if yield(arr[i], arr[i+1]) > 0
                saved = arr[i]
                arr[i] = arr[i+1]
                arr[i+1] = saved
                counter += 1
            end
        end
        if (counter == 0)
            break
        end
    end

    print arr
end

bubble_sort_by([4,3,78,2,0,2]) do |left,right|
    left - right
end

如您所见,它有两个问题:

  1. 空间yield - 基本上空间是额外的,因为它没有将括号中的数字作为参数传递;
  2. 块中的return - 您不希望块显式返回值,您需要在bubble_sort_by中对其进行评估,然后在上下文中使用它的结果。