除了匿名方法之外,有用的替代用途是产量吗?

时间:2014-10-16 01:37:40

标签: ruby yield proc

示例:

a = Proc.new do
  b = 'hey'
end

def a_method
  yield
end

a_method(&a) #=> 'hey'

我知道yield(或block.call)可以用作一个简单的协同例程,但我想知道,除了简单地获取返回值之外,还有更多(实际)用途吗?从中?我们可以从proc获取一些局部变量到main方法等吗?

2 个答案:

答案 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