如何编写一个接受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
答案 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
。