使用proc进行类方法

时间:2018-01-08 23:52:00

标签: ruby proc

如何编写一个接受proc的冒泡排序?

在为类编写方法时似乎不能.call

帮助!

class Array
      def bubble_sort!
            flag = true
          while flag
            flag = false
            self.each_with_index do |x, y|
              case x <=> self[y + 1]
              when 1
                self[y], self[y + 1] = self[y + 1], self[y]
                flag = true
              end
            end
          end
          self
      end

      def bubble_sort!(&prc)
        # With a proc

      end

    end

1 个答案:

答案 0 :(得分:2)

方法签名中的&prc

def m(&prc)

实际上只是一种将转换为Proc并为其命名的方法;这就是为什么你经常看到它叫&blk,其中“blk”是“block”的缩写。当你想将块传递给另一个方法时,通常会这样做:

# This is a highly contrived example of course.

def m1
  # Do something with the "anonymous" block
  yield
end

def m2(&blk)
  m1(&blk)
end

m2 { "This is the block" }

因此,如果您的bubble_sort!方法想要一个块,那么您可以将其全部命名,您只需yield并在方法中使用适当的参数:

def bubble_sort!
  self.each_with_index do |x, y|
    # ...
    something = yield x, y
    # ...
  end
end

如果您的bubble_sort!需要将该区块传递给其他方法,那么您会说def bubble_sort!(&blk)some_other_method(&blk)

def bubble_sort!(&blk)
  self.each_with_index do |x, y|
    # ...
    something = some_other_method(&blk)
    # ...
  end
end

如果您还需要执行该块以及将其传递给另一个方法,您可以像对待任何其他Proc一样对待它并说出blk.call