示例:
a = Proc.new do
b = 'hey'
end
def a_method
yield
end
a_method(&a) #=> 'hey'
我知道yield
(或block.call
)可以用作一个简单的协同例程,但我想知道,除了简单地获取返回值之外,还有更多(实际)用途吗?从中?我们可以从proc获取一些局部变量到main方法等吗?
答案 0 :(得分:2)
如果您对块的返回值不挑剔,可以使用binding
来完成。
a = Proc.new do
b = 'hey'
binding
end
def a_method
new_binding = yield
p new_binding.eval("b")
end
a_method(&a)
# => "hey"
如果您使用的是Ruby> = 2.1.0版本,则可以使用eval
来避免local_variable_get
的愚蠢:
p new_binding.local_variable_get(:b)
答案 1 :(得分:1)
Procs有很多用途。例如,您可以使用它来为对象提供指令。我使用proc告诉它如何排序,我做了一个冒泡排序。这里是猴子修补数组类:
class Array
def bubble_sort(&prc)
self.dup.bubble_sort!(&prc)
end
def bubble_sort!(&prc)
return self if count <= 1
prc = Proc.new { |x, y| x <=> y } unless prc.class == Proc
(0...self.count).each do |x|
((x + 1)...self.count).each do |y|
self[x], self[y] = self[y], self[x] if prc.call(self[x], self[y]) == 1
end
end
self
end
end