作为练习的一部分,我尝试以两种不同的方式实现冒泡排序算法。
对于第一部分,我已将冒泡排序算法实现为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是可能的吗?
答案 0 :(得分:4)
这里的问题是你将你定义为Proc的变量视为一个方法(在Array类上,因此是NoMethodError)。调用proc的正确方法如下:
boolean_operator.call(self[i],self[i+1])