gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:37:15 24 4
gpt4 key购买 nike

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

对于第一部分,我将冒泡排序算法实现为 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]。练习的下一部分是修改方法,使其需要一个 block 来执行比较:

[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”在调用它的地方没有定义(如果我删除输入中的 block 也没有定义)。我知道 Ruby 没有嵌套方法,但我认为在一个方法中定义过程和 lambda 是可能的吗?

最佳答案

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

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

关于ruby - 在 Ruby 中,使用方法中定义的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37644512/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com