作为练习的一部分,我尝试用两种不同的方式实现冒泡排序算法。
对于第一部分,我将冒泡排序算法实现为数组实例方法,如下所示:
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)"boolean_operator“似乎在调用它的地方没有定义(如果我移除输入中的块的话)。我理解Ruby没有嵌套的方法,但是我认为在方法中定义procs和lambda是可能的。
发布于 2016-06-05 17:08:25
这里的问题是,您将您定义的变量视为一个Proc,就像它是一个方法(在数组类上,因此是NoMethodError)。调用proc的适当方法如下:
boolean_operator.call(self[i],self[i+1])
https://stackoverflow.com/questions/37644512
复制相似问题