在 Ruby 中访问传递的块

sup*_*ary 1 ruby block

我有一个接受块的方法,让我们称之为外部。它依次调用接受另一个块的方法,将其称为内部方法。

我希望发生的是外部调用内部,传递给它一个调用第一个块的新块。

这是一个具体的例子:

class Array
  def delete_if_index
    self.each_with_index { |element, i| ** A function that removes the element from the array if the block passed to delete_if_index is true }
  end
end

['a','b','c','d'].delete_if_index { |i| i.even? }
  => ['b','d']
Run Code Online (Sandbox Code Playgroud)

传递给 delete_if_index 的块被传递给 each_with_index 的块调用。

这在 Ruby 中是否可行,更广泛地说,我们对接收它的函数中的块有多少访问权限?

Chr*_*rth 5

您可以将一个块包装在另一个块中:

def outer(&block)
  if some_condition_is_true
    wrapper = lambda {
      p 'Do something crazy in this wrapper'
      block.call # original block
    }
    inner(&wrapper)
  else
    inner(&passed_block)
  end
end

def inner(&block)
  p 'inner called'
  yield
end

outer do
  p 'inside block'
  sleep 1
end
Run Code Online (Sandbox Code Playgroud)

我会说打开一个现有的块并更改其内容是 Doing it Wrong TM,也许 continuation-passing 会在这里有所帮助?我也会警惕传递带有副作用的块;我尝试保持 lambdas 的确定性,并执行诸如删除方法主体中的内容之类的操作。在复杂的应用程序中,这可能会使调试变得容易得多。