首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Ruby中,使用方法中定义的函数

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

Stack Overflow用户
提问于 2016-06-05 17:00:07
回答 1查看 71关注 0票数 0

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

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

代码语言:javascript
复制
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

所以,例如,

代码语言:javascript
复制
[5,2,4].bubble_sort!

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

代码语言:javascript
复制
[1, 3, 5].bubble_sort! { |num1, num2| num1 <=> num2 } #sort ascending
[1, 3, 5].bubble_sort! { |num1, num2| num2 <=> num1 } #sort descending

为了不重复我自己的话,我尝试实现如下:

代码语言:javascript
复制
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

但是,如果我尝试用

代码语言:javascript
复制
p [5,2,4].bubble_sort! {|x,y| x<=>y}

我得到以下错误:

代码语言:javascript
复制
in `bubble_sort!': undefined method `boolean_operator' for [5, 2, 4]:Array (NoMethodError)

"boolean_operator“似乎在调用它的地方没有定义(如果我移除输入中的块的话)。我理解Ruby没有嵌套的方法,但是我认为在方法中定义procs和lambda是可能的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-05 17:08:25

这里的问题是,您将您定义的变量视为一个Proc,就像它是一个方法(在数组类上,因此是NoMethodError)。调用proc的适当方法如下:

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37644512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档