在Ruby中,使用方法中定义的函数

时间:2016-06-05 17:00:08

标签: ruby algorithm

作为练习的一部分,我尝试以两种不同的方式实现冒泡排序算法。

对于第一部分,我已将冒泡排序算法实现为Array实例方法,如下所示:

class Array
  def bubble_sort!
    sorted=false
    until sorted
      sorted=true
      for i in (0...self.length-1)
        if self[i]>self[i+1]
          self[i],self[i+1]=self[i+1],self[i]
          sorted=false
        end
      end
    end
    self
  end
end

所以,例如,

[5,2,4].bubble_sort!

返回[2,4,5]。练习的下一部分是修改方法,以便执行比较需要一个块:

[1, 3, 5].bubble_sort! { |num1, num2| num1 <=> num2 } #sort ascending
[1, 3, 5].bubble_sort! { |num1, num2| num2 <=> num1 } #sort descending

为了不重复自己,我尝试按如下方式实现:

class Array
  def bubble_sort!(&prc)
    if block_given?
      boolean_operator = Proc.new {|a,b| prc.call(a,b)==1}
    else
      boolean_operator = Proc.new {|a,b| a>b}
    end

    sorted=false
    until sorted
      sorted=true
      for i in (0...self.length-1)
        # if self[i]>self[i+1]
        if boolean_operator(self[i],self[i+1])
          self[i],self[i+1]=self[i+1],self[i]
          sorted=false
        end
      end
    end
    self
  end

但是,如果我尝试使用

进行测试
p [5,2,4].bubble_sort! {|x,y| x<=>y}

我收到以下错误:

in `bubble_sort!': undefined method `boolean_operator' for [5, 2, 4]:Array (NoMethodError)

好像是&#34; boolean_operator&#34;在某种程度上没有定义它被调用的位置(如果我删除输入中的块也不会)。我知道Ruby没有嵌套方法,但我认为在方法中定义procs和lambdas是可能的吗?

1 个答案:

答案 0 :(得分:4)

这里的问题是你将你定义为Proc的变量视为一个方法(在Array类上,因此是NoMethodError)。调用proc的正确方法如下:

boolean_operator.call(self[i],self[i+1])